题目大意:给你1-100的部分或者全部参赛队伍的对于题目1-9的提交信息,让你输出排名。
排名规则如下:
先按照做出题目数量排序,如果做题量一样,按照总用时排序,总用时是 做出该题的时间距离比赛开始的分钟数+该题正确之前的错误提交次数*20;如果总用时一样,按照队伍ID小的排在前面,如果该题最终未解决,该题不计罚时。你的程序应统计出至少提交一次的队伍。
输入规则如下:
输入第一行包含一个整数,表示测试数据的组数,接下来是一个空行,以后每两行测试数据间均用一个空行隔开;
每组测试数据的每一行包括三个数和一个字母,按队伍,题目,时间,状态顺序排列,状态为C,I,R,U,E,分别代表正确,错误,答疑请求,未测评,违规提交,后三种情况对评分无影响,输入数据按照收到顺序排列。
输出规则如下:
对每组测试数据,输出一个计分板,每行包含队伍ID,解出题目数,总用时;
相邻两组数据的输出之间应有一个空行隔开。
这道题其实不难,但是有几个坑点。
1.一个题目若被某队正确提交过,再错误提交的时候是不计罚时的;
2.每两组输出数据之间要有一个空行隔开,言外之意只有一组测试数据的话就不用输出空行;
3.每组测试数据的输入行数不定,因此用字符串输入要处理好;
4.对于getchar()的用法;
5.就是排序函数的构造;
6.对于有提交但没对的队伍应输出来;
代码如下:
#include<stdio.h>
#include<cstring>
#include<algorithm>
#include<iostream>
using namespace std;
int mark[105][11];//标记该队是否已经解决该题
int fashi[105][11];//标记该队解决该题之前的错误提交次数
int yb[105];//统计该队是否提交过
struct node{
int team;
int score;
int ti;
node():team(0),score(0),ti(0){};//结构体初始化
}he[105];
bool cmp(node a,node b)//排序函数
{
if(a.ti!=0&&b.ti!=0)
{
if(a.ti!=b.ti) return a.ti>b.ti;
else if(a.score!=b.score) return a.score<b.score;
else return a.team<b.team;
}
else if(a.ti==0&&b.ti==0)
return a.team<b.team;
else
return a.ti>b.ti;
}
void init()//初始化
{
memset(mark,0,sizeof(mark));
memset(fashi,0,sizeof(fashi));
memset(yb,-1,sizeof(yb));
for(int A=0;A<105;A++)
{
he[A].team=0;
he[A].score=0;
he[A].ti=0;
}
}
int main()
{
int n,k;
scanf("%d",&n);getchar();//此处getchar吸收scanf后的回车
for(k=1;k<=n;k++)
{
init();
if(k>1) printf("\n");//如果K>1,说明多组测试数据
int cnt=0,a,b,c;
char d[3],str[20];
if(k==1)//只有第一次输入时输入一个换行,此处getchar吸收这个换行,必须加k==1
getchar();
while(gets(str)!=NULL&& strcmp(str, ""))//处理输入的字符串,如果为空输入结束,开始处理
{ // strcmp(str, "")作用判断是否为空,NULL判断是否文件结束
int len=strlen(str),x=0;
d[0]=str[len-1];
a=b=c=0;
for(int i = 0; i < len - 1; i++)
{
if(str[i] >= '0' && str[i] <= '9')
x = x * 10 + str[i] - '0';
else
{
if(!a) a= x;
else if(a&&!b) b=x;
else if(a&&b) c=x;
x=0;
}
}
int T=a;
if(yb[a]==-1) {yb[a]=cnt;cnt++;}
a=yb[a];
he[a].team=T;
if(d[0]=='C'&&mark[a][b]==0)
{
he[a].score+=(fashi[a][b]*20+c);
he[a].ti++;
mark[a][b]=1;
}
else if(d[0]=='I'&&mark[a][b]==0)
fashi[a][b]++;
}
sort(he,he+cnt,cmp);
for(int j=0;j<cnt;j++)
printf("%d %d %d\n",he[j].team,he[j].ti,he[j].score);
}
return 0;
}