题意:模拟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 }