题意:模拟ACM Ranklist,按AC数,罚时,队伍编号排序。
题解:注意2种,A了再交,输出不是按照时间顺序的。
View Code
1 #include<cstdio> 2 #include<cstring> 3 #include<algorithm> 4 using namespace std; 5 struct Data 6 { 7 int id,tot,ti; 8 int pr[30]; 9 void init(int _id) 10 { 11 id=_id; 12 tot=ti=0; 13 memset(pr,0,sizeof(pr)); 14 } 15 bool operator<(const Data &ne)const 16 { 17 if(tot!=ne.tot) 18 return tot>ne.tot; 19 if(ti!=ne.ti) 20 return ti<ne.ti; 21 return id<ne.id; 22 } 23 }po[1005]; 24 void ac(int id,int p,int t) 25 { 26 if(po[id].pr[p]==-1) 27 return; 28 else 29 { 30 po[id].tot++; 31 po[id].ti+=po[id].pr[p]*1200+t; 32 po[id].pr[p]=-1; 33 } 34 } 35 void wa(int id,int p) 36 { 37 if(po[id].pr[p]==-1) 38 return; 39 else 40 po[id].pr[p]++; 41 } 42 struct Event 43 { 44 int id,p,t,a; 45 bool operator<(const Event &ne)const 46 { 47 return t<ne.t; 48 } 49 }EV[1005]; 50 int main() 51 { 52 int c,n; 53 while(scanf("%d%d",&c,&n)!=EOF) 54 { 55 for(int i=1;i<=c;i++) 56 po[i].init(i); 57 for(int i=0;i<n;i++) 58 { 59 int id,p,t,a; 60 scanf("%d%d%d%d",&EV[i].id,&EV[i].p,&EV[i].t,&EV[i].a); 61 } 62 sort(EV,EV+n); 63 for(int i=0;i<n;i++) 64 { 65 if(EV[i].a) 66 ac(EV[i].id,EV[i].p,EV[i].t); 67 else 68 wa(EV[i].id,EV[i].p); 69 } 70 sort(po+1,po+c+1); 71 for(int i=1;i<c;i++) 72 printf("%d ",po[i].id); 73 printf("%d\n",po[c].id); 74 } 75 return 0; 76 }