题目链接:http://acm.hust.edu.cn/vjudge/contest/view.action?cid=115361#problem/D
题意大致是:给出最多50000个人,拥有最初速度F和1秒后的速度V,(F<=500,V<=100)每秒将速度最快的那个人淘汰,按淘汰的人的顺序输出他们的序号。
思路:由于人数很多,用暴力更新每秒淘汰的人显然会TLE。注意到F很小,那么对于任意两个人来说,即使有500的路程差,速度快的那个人哪怕是每秒只快1米,在501秒后就能超越,也就是说,501秒以后速度越快的人就一直处于快的地位,速度一样的人,F大的先被淘汰,再一样,按照序号小的先淘汰即可;那么在501秒以后只要按照这个方法排一个序即可。而对于501秒以内的,只要暴力模拟每秒淘汰最快的即可。
当然,这是按照F范围小赖考虑的,V范围小的方法还不会- -,,下次会了再补上。
下面给出AC代码:
1 #include <stdio.h> 2 #include <algorithm> 3 #include <set> 4 #include <string.h> 5 using namespace std; 6 struct node 7 { 8 int id; 9 int v; 10 int f; 11 int s; 12 }P[50000+5]; 13 int tot; 14 bool cmp(node A,node B) 15 { 16 if(A.v==B.v) 17 { 18 if(A.f==B.f) 19 { 20 return A.id<B.id; 21 } 22 else return A.f>B.f; 23 } 24 else return A.v>B.v; 25 } 26 27 int main() 28 { 29 int T; 30 scanf("%d",&T); 31 for(int kace=1;kace<=T;kace++) 32 { 33 tot=0; 34 int n; 35 scanf("%d",&n); 36 for(int i=1;i<=n;i++) 37 { 38 int f,v; 39 scanf("%d%d",&f,&v); 40 P[++tot]=(node){i,v,f,f}; 41 } 42 printf("Case #%d: ",kace); 43 for(int i=1;i<=501;i++) 44 { 45 if(i>n) break; 46 int id=1; 47 int maxsum=-1; 48 for(int j=1;j<=tot;j++) 49 { 50 if(i!=1&&P[j].s!=-1) P[j].s+=P[j].v; 51 if(maxsum<P[j].s) {id=P[j].id;maxsum=P[j].s;} 52 } 53 if(i!=1) printf(" "); 54 printf("%d",id); 55 P[id].s=P[id].f=P[id].v=-1; 56 } 57 sort(P+1,P+1+tot,cmp); 58 for(int i=1;i<=n-501;i++) 59 { 60 printf(" %d",P[i].id); 61 } 62 puts(""); 63 } 64 return 0; 65 }