bzoj3709: [PA2014]Bohater
你能感受搞了一个星期文化课然后爆炸螺旋升天法力不无边准备被D飞回去继续搞文化课怀念OI水一波贪心然而还是被lxj带飞只会%%%%的lj编程爱好者终于摸了下键盘然后A了一题抬头一看发现肉老师又虐我20题的绝望吗??!
这题是个巧妙的贪心
然而它AC率低的原因是scanf输入竟然毒瘤般CE硬逼着人家学了个读入优化输入只有1000000的HP值竟然在后期可以奶爆LL还有就是我也不知道为啥我排序用了个bcmp然后居然又会CE这是人性的险恶还是道德的沦丧???!
怎么贪呢首先分两种情况打完能够加血的当然是先打了这个按先弱小后强大来虐如果虐不动后面肯定也虐不动所以这样直接NIE就行
打完不能加血我们就按谁奶得多先打谁为什么呢因为反正假如能活下来个个都得打死然而前期奶得越多当然撑得越久那么你就问了假如一个超级大胖子打死了奶得很多但是打不死那我先打它岂不是很吃亏但是你想一想你这个超级大胖子现在打不死以后肯定也完因为血药奶得没有掉血快
然而ACM赛制使得我可以把两个排序都试一遍
#include<cstdio> #include<iostream> #include<cstring> #include<cstdlib> #include<algorithm> #include<cmath> using namespace std; typedef long long LL; inline int read() { int x=0,f=1;char ch=getchar(); while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();} while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();} return x*f; } struct node { int a,d,id; }h[110000],b[110000];int hlen,blen; bool cmp1(node n1,node n2){return n1.d<n2.d;} bool cmp2(node n1,node n2){return n1.a>n2.a;} int as[110000],aslen; int main() { int n,a,d;LL z; n=read();z=(LL(read())); hlen=0;blen=0; int nmin=999999999,nid; for(int i=1;i<=n;i++) { d=read();a=read(); if(a-d>0)h[++hlen].a=a,h[hlen].d=d,h[hlen].id=i; else { b[++blen].a=a,b[blen].d=d,b[blen].id=i; if(a<nmin)nmin=a,nid=blen; } } sort(h+1,h+hlen+1,cmp1); aslen=0; for(int i=1;i<=hlen;i++) { if(z<=h[i].d) { printf("NIE\n"); return 0; } z-=h[i].d; z+=h[i].a; as[++aslen]=h[i].id; } for(int i=1;i<=blen;i++) { if(i==nid)continue; if(z<=b[i].d) { printf("NIE\n"); return 0; } z-=b[i].d; z+=b[i].a; as[++aslen]=b[i].id; } if(z<b[nid].a)printf("NIE\n"); else { printf("TAK\n"); for(int i=1;i<=aslen;i++)printf("%d ",as[i]); printf("%d\n",b[nid].id); } return 0; }
pain and happy in the cruel world.