思路:这道题和前一个校赛排名不一样的地方就是输入的数据,这道题我们要先录入输入的队伍名字,后续通过查找队伍名字录入相关数据
//参考了别的文章的把ac题的题目改成数字的小细节
/*描述 下面是校赛的排名规则:
比赛期间,提交代码后,系统会返回正确或错误等结果。最后的获胜者为正确解答题目最多,如果同题数则总用时最少的队伍。
每道试题的时间花费将从竞赛开始到试题提交并且被判定为正确为止,其间每一次提交运行结果被判错误的话将被加罚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<stdio.h>
#include<algorithm>
#include<string.h>
using namespace std;
typedef struct
{
int time;
int pass;
char name[21];
int acname[20];
int wrong[20];
}team;
team stu[100000];
bool cmp(team a,team b)
{
if(a.pass==b.pass)
{
return a.time<b.time;
}
else return a.pass>b.pass;
}
int main()
{
int n=0,j,i,k=0,t,flag,passtime;
char teamname[21],title;
while(scanf("%d %s %c %d",&passtime,teamname,&title,&flag)!=EOF)
{
t=0;
//printf("%d %s %c %d",min,curname,title,ifpass);
for(i=0;i<=n-1;i++)
{
if(!strcmp(teamname,stu[i].name))
{
t=1;break;
}
}
if(t==0)//第一次出现
{
strcpy(stu[n].name,teamname);
i=n;//i指向这只新队伍,否则用之前找到重名的对应的i
}
if(flag==0&&stu[i].acname[title-65]!=1)//通过而且不是之前ac过的题
{
stu[i].pass++;//ac题数++
stu[i].acname[title-65]=1;//标记为已通过
stu[i].time+=stu[i].wrong[title-65]*20+passtime;//时间=通过加罚时
}
else if(flag!=0)//没ac
stu[i].wrong[title-65]++;
n++;
}
stable_sort(stu,stu+n-1,cmp);
for(i=0;i<=n-1;i++)
if(stu[i].pass) printf("%s %d %d\n",stu[i].name,stu[i].pass,stu[i].time);
return 0;
}