#include<iostream> #include<cstdio> #include<algorithm> #include<cstring> #include<math.h> using namespace std; typedef long long ll; using namespace std; int b[110],p[7]; struct NODE { int num,h,m,s,r,t; }a[110]; bool cmp(int x,int y) { if(a[x].num!= a[y].num) return a[x].num>a[y].num; return a[x].t< a[y].t; } int main() { int i,j,n; while(cin>>n && n+1) { memset(p,0,sizeof(p)); p[6]=0; for(i=1;i<=n;i++) { scanf("%d %d:%d:%d",&a[i].num,&a[i].h,&a[i].m,&a[i].s); a[i].t = 3600*a[i].h + 60*a[i].m+a[i].s; b[i]=i; p[a[i].num]++;//题数的人数 } sort(b+1,b+n+1,cmp); for(i=4;i>=0;i--) p[i]+=p[i+1];// 题数的人数要加上前面的 for(i=1;i<=n;i++) a[b[i]].r=i; //排名 for(i=1;i<=n;i++) { int t= a[i].r - p[a[i].num+1] , s =0;//排名等于总排名 - (题数+1)的人数 if( (t<= (p[a[i].num]-p[a[i].num+1] )/2|| p[a[i].num]==1 )&& a[i].num && a[i].num!=5 ) s=5;// cout<<100-(5-a[i].num)*10+s<<endl; } cout<<endl; } }
题目连接 http://acm.hust.edu.cn/vjudge/contest/126708#problem/E
题目思路, 根据做题个数和时间排出一个总排名(开始时间没有想到化为一个整的时间,小时和小时比,分钟和分钟比。。有点小麻烦), 有一个数组p[i]记录做出了i道题的人数,
注意做出了5道题的也做出了四道题。所以 排名等于总排名 - (题数+1)的人数。