http://baike.baidu.com/link?url=7tOqn6wVEwR6CB61TcpypU23obcxnhOX4HNkyMtV57pBZ8_8tXRQARdLAJ_OPmvoGwBPvpeT9l-vgMGqFoaBRD1PDF74WWcWanNHkJZ6HMnkIhmiXgpmyloUeRZ_AE3A
cjwssb知道是误会之后,跟你道了歉。你为了逗笑他,准备和他一起开始魔法。不过你的时间不多了,但是更惨的是你还需要完成n个魔法任务。假设你当前的时间为T,每个任务需要有一定的限制ti表示只有当你的T严格大于ti时你才能完成这个任务,完成任务并不需要消耗时间。当你完成第i个任务时,你的时间T会加上bi,此时要保证T在任何时刻都大于0,那么请问你是否能完成这n个魔法任务,如果可以,输出+1s,如果不行,输出-1s。
第一行:一个整数Z,表示有Z个测试点。
对于每个测试点
第一行:一个整数n,T,表示有n个任务,你一开始有T的时间。
接下来n行,每行2个数字,ti与bi
对于每个测试点,输出+1s或者-1s
1 2 13 1 -9 5 -3
+1s
对于20%的数据,n≤10
对于100%的数据,n≤100,000,Z≤10,ti,T≤100,000,−100,000≤bi≤100,000
By:lantian
贪心再加上结构体排序,以耗时少中加的最多为优先排。
代码
#include<cmath> #include<cstdio> #include<cstring> #include<iostream> #include<algorithm> using namespace std; const int N=100010; int z,n,t; int num,cnt; struct no { int b,t; } a[N],f[N]; bool cmp(no a,no b) { return a.t<b.t; } bool cmp1(no a,no b) { return a.t+a.b>b.t+b.b; } int main () { scanf("%d",&z); while(z--) { num=cnt=0; bool flag=false; scanf("%d%d",&n,&t); for(int i=1,x,y; i<=n; i++) { scanf("%d%d",&x,&y); if(y>0) { a[++cnt].t=x; a[cnt].b=y; } else { f[++num].t=x; f[num].b=y; } } sort(a+1,a+1+cnt,cmp); sort(f+1,f+1+num,cmp1); for(int i=1; i<=cnt; i++) if(t>a[i].t) t+=a[i].b; else { flag=true; break; } for(int i=1; i<=num; i++) { if(t>f[i].t) t+=f[i].b; else { flag=true; break; } if(t<=0) { flag=true; break; } } if(!flag) printf("+1s\n"); else printf("-1s\n"); } return 0; }
原文:https://www.cnblogs.com/mysh/p/11787775.html