http://www.programming-challenges.com/pg.php?page=downloadproblem&probid=110207&format=html
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <cmath>
using namespace std;
struct team
{
int num;//记录该队的序号
int time;//用来存储该队的总罚时
int ac;//用来存储该队的ac数目
bool vis;//用来标记该队是否交过题
bool tnum[11];//题号,用来标记是否做出该题
int tt[11];//单个题目的罚时
} p[105];
int cmp(const void *_x,const void *_y) //对各队进行排序,我们熟知,第一关键字是ac数(降序),第二关键字是总罚时(升序)
{
team *x=(team *)_x;
team *y=(team *)_y;
if(x->vis==y->vis)
{
if(x->ac==y->ac)
return x->time-y->time;
return y->ac-x->ac;
}
return y->vis-x->vis;
}
int main()
{
int a,b,t;
char k;
int ncase;
cin>>ncase;
getchar();
getchar();
while(ncase--)
{
char s[300];
int n=0;
for(int i=1; i<=100; i++)//初始化
{
p[i].num=i;
p[i].ac=0;
p[i].time=0;
p[i].vis=0;
for(int j=0;j<=10;j++)
{
p[i].tnum[j]=0;
p[i].tt[j]=0;
}
}
while(gets(s)!=NULL)
{
if(strlen(s)<2)break;
sscanf(s,"%d %d %d %c",&a,&b,&t,&k);
p[a].vis=1;
if(!p[a].tnum[b]&&k=='C')//如果有题目AC了,将题目标记,以后的提交无效
{
p[a].tnum[b]=1;
p[a].tt[b]+=t;
}
if(!p[a].tnum[b]&&k=='I')//在题目未AC前将罚时存入
{
p[a].tt[b]+=20;
}
n++;
}
for(int i=1; i<=100; i++)
{
for(int j=1; j<=9; j++)
{
if(p[i].tnum[j])
{
p[i].ac++;
p[i].time+=p[i].tt[j];
}
}
}
qsort(p+1,100,sizeof(p[0]),cmp);
for(int i=1; i<=100; i++)
{
if(!p[i].vis)break;
cout<<p[i].num<<" "<<p[i].ac<<" "<<p[i].time<<endl;
}
if(ncase)cout<<endl;//两组样例之间要输出空行
}
return 0;
}