题目背景 http://baike.baidu.com/link?url=7tOqn6wVEwR6CB61TcpypU23obcxnhOX4HNkyMtV57pBZ8_8tXRQARdLAJ_OPmvoGwBPvpeT9l-vgMGqFoaBRD1PDF74WWcWanNHkJZ6HMnkIhmiXgpmyloUeRZ_AE3A 题目描述 cjwssb知道是误会之后,跟你道了歉。你为了
题目背景
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
输入输出样例
输入 #11 2 13 1 -9 5 -3输出 #1
+1s
说明/提示
对于20%的数据,n≤10
对于100%的数据,n≤100,000,Z≤10,ti,T≤100,000,−100,000≤bi≤100,000
By:lantian
贪心再加上结构体排序,以耗时少中加的最多为优先排。
#include<cstdio> #include<iostream> #include<algorithm> #include<cstring> #define MAXN 2147483647 using namespace std; struct node{ int tim; int b; }a[100010]; struct ss{ int tim; int b; }f[100010]; int n,t,z,i,j; inline int read(){ int s=0,w=1; char ch=getchar(); while(ch<‘0‘||ch>‘9‘){ if(ch==‘-‘){ w=-1; } ch=getchar(); } while(ch>=‘0‘&&ch<=‘9‘){ s=s*10+ch-‘0‘; ch=getchar(); } return s*w; } int cmp(node &a,node &b){ return a.tim<b.tim; } int comp(ss &a,ss &b){ return a.b+a.tim>b.b+b.tim; } int main(){ z=read(); for(i=1;i<=z;i++){ int s=0,cnt=0,num=0; n=read(); t=read(); for(j=1;j<=n;j++){ int x,y; x=read(); y=read(); if(y>0){ a[++cnt].tim=x; a[cnt].b=y; } else{ f[++num].tim=x; f[num].b=y; } } sort(a+1,a+cnt+1,cmp); sort(f+1,f+num+1,comp); for(j=1;j<=cnt;j++){ if(t>a[j].tim){ t+=a[j].b; } else{ s=1; break; } } for(j=1;j<=num;j++){ if(t>f[j].tim){ t+=f[j].b; } else{ s=1; break; } if(t<=0){ s=1; break; } } if(s==0){ printf("+1s\n"); } else{ printf("-1s\n"); } } return 0; }