Description
下面是校赛的排名规则:
比赛期间,提交代码后,系统会返回正确或错误等结果。最后的获胜者为正确解答题目最多,
如果同题数则总用时最少的队伍。
每道试题的时间花费将从竞赛开始到试题提交并且被判定为正确为止,
其间每一次提交运行结果被判错误的话将被加罚20分钟时间,
未正确解答的试题不记时,如果已经返回正确的题目再重复提交则不影响结果。
例如:
A、B两队都正确完成两道题目,其中A队提交这两题的时间分别是比赛开始后60分钟和165分钟,
B队为80分钟和130分钟,但B队第一个题提交了2次才通过。
这样A队的总用时为60+165=225而B队为(80+20)+130=230,所以A队以总用时少而获胜。
现在给出裁判机上面所有队伍的提交时间(分钟数)和返回结果,需要你编程输出当前比赛的排行榜。
注:0题的队伍不需要输出
输入格式
每行一个评判结果
格式为:时间(第几分钟提交的)+半角空格+队名+半角空格+题号+半角空格+评判结果(0通过,其它为出错)
题号由大写A字符开始,第2题是B,依次类推,最多不超过15题
所有评判结果已经按时间排序好
输出格式
输出排名,一行一个,格式为队名+半角空格+通过题数+半角空格+罚时
注:0题的队伍不需要输出
测试数据中,没有同题且同罚时的情况
输入样例
2 abc A 4
5 abc B 0
6 def A 0
10 abc A 0
13 xyx A 4
20 def B 5
输出样例
abc 2 35
def 1 6
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <vector>
#include <string.h>
using namespace std;
struct team
{
char name[22];//队名
int pass;//通过题数
int correct[20];//通过的题目,题号作为数组下标
int error[20];//错误的题目,题号作为数组下标,存放做错的次数
int time;//总罚时
int val;//按照读取的先后顺序输出
};
team teams[1000]= {{0}};
//输出排序
bool compare(team a,team b)
{
if(a.pass!=b.pass)
return a.pass>b.pass;
if(a.time!=b.time)
return a.time<b.time;
return a.val<b.val;
}
int main()
{
int nowtime; //提交时间
char teamname[22]; //队名
char questionname; //提交题号
int result; //提交结果
int flag; //有无这个队伍
int num=0; //当前队伍数量
int i;
while((scanf("%d%*c%s%*c%c%*c%d",&nowtime,teamname,&questionname,&result))>0)
{
flag=0;
for(i=0; i<num; i++)
{
if(strcmp(teams[i].name,teamname)==0)
{
flag=1;
break;
}
}
if(flag==0)//无这个队伍
{
strcpy(teams[i].name,teamname);
num=num+1;
teams[i].val=i;
//把该队伍通过题目和错误题目的数组全部置为0
memset(teams[i].correct,0,sizeof(teams[i].correct));
memset(teams[i].error,0,sizeof(teams[i].error));
/*
cout<<"队伍名字"<<teams[i].name<<endl;
cout<<"通过题数"<<teams[i].pass<<endl;
cout<<"总罚时"<<teams[i].time<<endl;
cout<<"通过记录"<<teams[i].correct[questionname-65]<<endl;
cout<<"错误记录"<<teams[i].error[questionname-65]<<endl;
*/
}
if(result==0&&teams[i].correct[questionname-65]!=1) //题目通过并且之前没有正确提交
{
teams[i].pass++;
teams[i].correct[questionname-65]=1; //记录
teams[i].time=teams[i].time+teams[i].error[questionname-65]*20+nowtime; //记得累加之前的时间
/*
cout<<endl;
cout<<"队伍名字"<<teams[i].name<<endl;
cout<<"通过题数"<<teams[i].pass<<endl;
cout<<"总罚时"<<teams[i].time<<endl;
cout<<"通过记录"<<teams[i].correct[questionname-65]<<endl;
cout<<"错误记录"<<teams[i].error[questionname-65]<<endl;
*/
}
else if(result!=0)
{
teams[i].error[questionname-65]++;
/*
cout<<endl;
cout<<"队伍名字"<<teams[i].name<<endl;
cout<<"通过题数"<<teams[i].pass<<endl;
cout<<"总罚时"<<teams[i].time<<endl;
cout<<"通过记录"<<teams[i].correct[questionname-65]<<endl;
cout<<"错误记录"<<teams[i].error[questionname-65]<<endl;
*/
}
}
sort(teams,teams+num,compare);
for(i=0; i<num; i++)
{
if(teams[i].pass!=0)
{
cout<<teams[i].name<<" "<<teams[i].pass<<" "<<teams[i].time<<endl;
}
}
return 0;
}
参考原文