您的位置:首页 > 其它

BZOJ 3709: [PA2014]Bohater 贪心

2016-10-21 17:32 465 查看
时空隧道

分析:

这种题基本上都是贪心了…

我们考虑怎样安排才能使得自己不会死掉…QAQ…当然是生命值越大越好…所以为们应该贪心的先使自己的生命值增大再去减小生命值…

所以我们就得到了一个大概的贪心方法…对于每一个怪物记录一个值叫做c=a-d…然后先选c>0的再选c<0的…

那么c>0的应该按照怎样的顺序呢?

还是同样的贪心思想…先选伤害小的…这样能够使得自己死的慢一点…(反正你最后生命值都在增大…所以就要把伤害打的留在后面生命值大的时候去干掉怪物…)

那c<0的时候呢?当然是先选回血值大的…因为反正你都要减小生命值了…那么你就尽可能的让自己回血多一点…

(小环子有一个更机智的解释(QAQ为此她嘲笑了我好久QAQ):

倒着想…就是我们考虑最后一个…因为受的总伤害值是不变的…所以说最后一个回血值是没有用的,那就让他尽量小…机智啊…)

代码如下:

#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
//by NeighThorn
using namespace std;
//秋兰兮麋芜,罗生兮堂下
const int maxn=100000+5;
int n,stk[maxn]; long long z;
struct M{
int a,d,c,num;
}s[maxn];
inline bool cmp1(M x,M y){
return x.c>y.c;
}
inline bool cmp2(M x,M y){
return x.d<y.d;
}
inline bool cmp3(M x,M y){
return x.a>y.a;
}
signed main(void){
scanf("%d%lld",&n,&z);
for(int i=1;i<=n;i++)
scanf("%d%d",&s[i].d,&s[i].a),s[i].c=s[i].a-s[i].d,s[i].num=i;
sort(s+1,s+n+1,cmp1);int id=1;
for(;id<=n&&s[id].c>0;id++);id--;
sort(s+1,s+id+1,cmp2);sort(s+id+1,s+n+1,cmp3);
for(int i=1;i<=n;i++){
z-=s[i].d;
if(z<=0) {puts("NIE");return 0;}
else z+=s[i].a,stk[i]=s[i].num;
}puts("TAK");
for(int i=1;i<=n;i++)
printf("%d ",stk[i]);
puts("");
return 0;
}


by >_< NeighThorn
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: