[bzoj4977]跳伞求生<贪心>
题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=4977
这是八月月赛的一道题,月赛的时候和同学讨论了一下,最后由一位叫二哥的大佬率先AC,用的是贪心(学不来学不来),虽然正解貌似是dp(不清楚);
看了看这道题的数据范围,我并没有打算怎么去优化,直接暴力的处理加上贪心操作,我一开始用的是优先队列,结果数据一大结果就是负数(还有这操作???),后来我把优先队列改成了几个数组,然后多次快排(毕竟数据范围不大),终于AC了;
这个贪心用到了一个结论,就是在确定的敌人和队友之间,交换彼此的对手,总值不变,意思是:
原本的配对方案是队友1打敌人1,队友2打敌人3,然后假如队友1,2交换,总值不变,用式子来说就是:
ans=(a1-b1+c1)+(a2-b2+c2)=(a2-b1+c1)+(a1-b2+c2);
具体步骤是:
1.首先存下ci-bi的值val,然后按照val从大到小排序,并让ai按照从大到小排序,同时开一个桶(本人的方法,没有优化,听起来可能比较复杂)
2.然后按val大小找,如果当前敌人可以被打死,那就意味这我们需要一个我方队友,tot++(建议这时候找刚刚比b大的a)
3.然后找前tot大的人作为我方人员,与敌方参战的tot人配对,这时候我开了两个数组,分别存,我方参战和敌方参战人员,并按从小到大排序
4.接着会用到我们的结论(即上文红字),所以我们要删除人,我们把我方ai最小和敌人val(ci-bi)最小的相加,如果为负就删除,不然留下他们就是负贡献(至于为什么删和为什么可以删掉,想想结论,并假设3步骤选出来的人就固定且选出来的每个队友都可以打一个任意选出来的敌人)
5.最后把留下的贡献为正的相加即可
代码我先给一个优先队列的,可以A一部分(并没有什么卵用),但是希望大佬能为我解释一下,为什么数据大了就会成负的?
第一个代码是不能AC的代码!!
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<cstdlib>
#include<cmath>
#include<queue>
#include<stack>
#define maxn 100005
using namespace std; struct node{
int b,c,val;
}e[maxn]; int comp(const void*a,const void*d)
{
if((*(struct node*)a).val==(*(struct node*)d).val)
return (*(struct node*)a).b>(*(struct node*)d).b?:-;
return (*(struct node*)a).val>(*(struct node*)d).val?-:;
} int n,m,gun[maxn],maxx;
long long sc; priority_queue<int>q;
priority_queue<int,vector<int>,greater<int> >q1;
priority_queue<int,vector<int>,greater<int> >q2; int main()
{
scanf("%d%d",&n,&m);
for(int i=;i<=n;i++)
{
int x;
scanf("%d",&x);
maxx=max(maxx,x);
//if(gun[x]==0)q.push(x);
q.push(x);
gun[x]++;//一个桶来存各种子弹人数,每次选距离消耗最近的
}
for(int i=;i<=m;i++)
{
int x,y;
scanf("%d%d",&x,&y);
e[i].b=x;e[i].c=y;
e[i].val=y-x;
}
e[].b=0x3f3f3f;e[].val=0x3f3f3f;
qsort(e,m+,sizeof(e[]),comp);
int tot=;
for(int i=;i<=m;i++)
{
if(e[i].b<maxx){
for(int j=e[i].b+;j<=maxx;j++)
{
if(gun[j]>)
{
gun[j]--;
tot++;
q2.push(e[i].val);
break;
} }
} }
for(int i=;i<=tot;i++)
{
int dd=q.top();
q1.push(q.top());
q.pop();
}
for(int i=;i<=tot;i++)
{
int x,y;
x=q1.top();y=q2.top();
if(x+y<=){
q1.pop();q2.pop();
}
else break;
}
int yy=q1.size();
for(int i=;i<=yy;i++)
{
sc+=q1.top()+q2.top();
q1.pop();q2.pop();
}
printf("%lld",sc);
}
接下来是用数组和快排代替优先队列的(排版较暴力)
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<cstdlib>
#include<cmath>
#include<queue>
#include<stack>
#define maxn 100005
using namespace std; struct node{
int b,c,val;
}e[maxn]; int comp(const void*a,const void*d)
{
if((*(struct node*)a).val==(*(struct node*)d).val)
return (*(struct node*)a).b>(*(struct node*)d).b?:-;
return (*(struct node*)a).val>(*(struct node*)d).val?-:;
} int cmp1(const void*a,const void*d)
{
return (*(int*)a)>(*(int*)d)?-:;
}//从大到小 int cmp2(const void*a,const void*d)
{
return (*(int*)a)>(*(int*)d)?:-;
}//从小到大 int n,m,gun[maxn],maxx,num[maxn],nu[maxn];
long long sc; int main()
{
/* freopen("in.in","r",stdin);
freopen("my.out","w",stdout);*/
scanf("%d%d",&n,&m);
for(int i=;i<=n;i++)
{
int x;
scanf("%d",&x);
maxx=max(maxx,x);
num[i]=x;
gun[x]++;//一个桶来存各种子弹人数,每次选距离消耗最近的
}
num[]=0x3f3f3f;
qsort(num,n+,sizeof(int),cmp1);
for(int i=;i<=m;i++)
{
int x,y;
scanf("%d%d",&x,&y);
e[i].b=x;e[i].c=y;
e[i].val=y-x;
}
e[].b=0x3f3f3f;e[].val=0x3f3f3f;
qsort(e,m+,sizeof(e[]),comp);
int tot=;
for(int i=;i<=m;i++)
{
if(e[i].b<maxx){
for(int j=e[i].b+;j<=maxx;j++)
{
if(gun[j]>)
{
gun[j]--;
tot++;
nu[tot]=e[i].val;
break;
} }
} }
num[]=nu[]=-0x3f3f3f;
qsort(num,tot+,sizeof(int),cmp2);
qsort(nu ,tot+,sizeof(int),cmp2);
for(int i=;i<=tot;i++)
{
if(num[i]+nu[i]<=)
{
continue;
}else{
sc+=num[i]+nu[i];
}
}
printf("%lld",sc); }
[bzoj4977]跳伞求生<贪心>的更多相关文章
- bzoj4977 跳伞求生——贪心
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4977 今天讲的贪心题,真神奇啊: 首先,要得到尽量多选队友的解: 把队友按 a[i] 从小到 ...
- BZOJ4977[Lydsy1708月赛]跳伞求生——贪心+堆+模拟费用流
题目链接: 跳伞求生 可以将题目转化成数轴上有$n$个人和$m$个房子,坐标分别为$a_{i}$和$b_{i}$,每个人可以进一个他左边的房子,每个房子只能进一个人.每个房子有一个收益$c_{i}$, ...
- BZOJ4977 跳伞求生(贪心)
如果现在选定了一些要求消灭的敌人而不考虑积分,显然应该让每个敌人被刚好能消灭他的人消灭.再考虑最大化积分,显然我们应该优先消灭ci-bi大的敌人,所选用的a也应尽量大.于是按ci-bi从大到小排序,用 ...
- BZOJ4977: [[Lydsy1708月赛]跳伞求生(不错的贪心)
4977: [[Lydsy1708月赛]跳伞求生 Time Limit: 5 Sec Memory Limit: 256 MBSubmit: 446 Solved: 142[Submit][Sta ...
- 【刷题】BZOJ 4977 [Lydsy1708月赛]跳伞求生
Description 小Q最近沉迷于<跳伞求生>游戏.他组建了一支由n名玩家(包括他自己)组成的战队,编号依次为1到n.这个游 戏中,每局游戏开始时,所有玩家都会从飞机上跳伞,选择一个目 ...
- BZOJ4977 八月月赛 Problem G 跳伞求生 set 贪心
欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ4977 - 八月月赛 Problem G 题意 小明组建了一支由n名玩家组成的战队,编号依次为1到n ...
- 2018.09.24 bzoj4977: [[Lydsy1708月赛]跳伞求生(贪心+线段树)
传送门 线段树好题. 这题一看我就想贪心. 先把a,b数组排序. 然后我们选择a数组中最大的b个数(不足b个就选a个数),分别贪心出在b数组中可以获得的最大贡献. 这时可以用线段树优化. 然后交上去只 ...
- BZOJ4977: [[Lydsy1708月赛]跳伞求生
传送门 直接贪心 考虑到 \(n\) 个人的贡献都是 \(a_i\),另外 \(m\) 个人的贡献都是 \(c_i-b_i\) 首先 \(a_i>b_j\) 的限制不好做,所以将 \(a,b\) ...
- bzoj 1034 [ZJOI2008]泡泡堂BNB——贪心
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1034 原来觉得和 bzoj4977跳伞求生 有点像(虽然还没做). 所以对于a[ ]从小到大 ...
随机推荐
- Css里的BFC
一.BFC简介 BFC全称:Block Formatting Contexts (BFC,块级格式化上下文),就是 一个块级元素 的渲染显示规则 (可以把 BFC 理解为一个封闭的大箱子,,容器里面的 ...
- FCC 成都社区·前端周刊 第 7 期
01. ES2016, 2017, 2018 中的新特性 文章介绍了 18 个 ECMAScript 2016,2017 和 2018 中新增加的特性,这些特性已被加入到 TC39 提案中.包括Arr ...
- python之路-基本数据类型之int整数和bool值
1.int整数 #整数:主要用来进行数学运算,在python3中所有的整数都是int类型, #整数可以进行的操作有:bit_length(),计算整数在内存中占用的二进制码的长度 #例子:查看整数在内 ...
- [LeetCode] 1370. Increasing Decreasing String
1. 原题链接:https://leetcode.com/problems/increasing-decreasing-string/ 2. 解题思路 直观的想法是:用有序map<char, i ...
- OpenCV中Mat的基本用法:创建、复制
OpenCV中Mat的基本用法:创建.复制 一.Mat类的创建: 1.方法一: 通过读入一张图像,直接将其转换成Mat对象. Mat image = imread("test.jpg&quo ...
- 开放融合易用@门户移动开发新体验-逐浪CMS v8.0.1全面发布
北京时间2019年8月30日消息: 领先的web内核研发厂商--上海Zoomla!逐浪CMS团队发布最新CMS版本:Zoomla!逐浪CMS v8.0.1,这是继上个版本v8.0后功能最具完强大与精彩 ...
- django 从零开始 4 404页面和500页面设置
在视图函数中定义两个 函数 分别对应404 个500页面 (自定义html内容吧,这里只是展示) 在template页面指向自己定义的404.html和500.html页面 在项目的urls中设置 h ...
- 这些MongoDB的隐藏操作你真的都掌握了吗?反正我是刚知道
背景 最近公司系统还原用户时偶尔会出现部分用户信息未还原成功的问题,最为开发人员,最头疼的不是代码存在bug,而是测试发现了bug,但一旦我去重现,它就不见了.Are you kidding me? ...
- Vue2.0 【第二季】第3节 Vue.set全局操作
目录 Vue2.0 [第二季]第3节 Vue.set全局操作 第3节:Vue.set全局操作 一.引用构造器外部数据 二.在外部改变数据的三种方法: 三.为什么要有Vue.set的存在? Vue2.0 ...
- Echart饼形图和折线图的循环展示及选择展示
需求:根据不同的入参调同一接口,循环展示一组饼形图或折线图: 主要问题:在于给定的数据格式不符合图表的配置项格式,需要拆分组装数据:首先默认展示几个图表,当选中一个类别,需要展示其中一个的时候,页面中 ...