题目链接:登录—专业IT笔试面试备考平台_牛客网
#include <bits/stdc++.h>
using namespace std;
struct Group{
string name;//名字
int accept;//通过的题数
int time;//总罚时
int cns[15];//每道题答题次数
bool isright[15];//每道题答题状态
}group[5005];
bool cmp(Group a,Group b){//比较
if(a.accept!=b.accept) return a.accept>b.accept;
if(a.time!=b.time) return a.time<b.time;
return a.name<b.name;
}
int n;//题目数量
int namelengthmax;//名字最长长度
int g;//下标
map<string,int> mp;//记录每个队在group中的编号
int main(){
cin>>n;
string str;
string name;
cin>>str;
while(str!="GAME"){
int t=stod(str.substr(0,2))*60+stod(str.substr(3,2));//获得时间
char id;//题目编号
cin>>id;
cin>>str;//答题结果
int flag=0;//标记答题正确与否
if(str=="Accepted"){//答题正确,标记flag为1
flag=1;
}
else if(str=="Compile"){//不需记录,continue出去就好了,但是要记得输入下一行
getline(cin,str);
cin>>str;//输入下一行
continue;
}
else if(str=="Wrong"||str=="Runtime"||str=="Presentation"){//两个单词
cin>>str;//输入第二个单词,用不上,直接跳过
}
else{//三个单词
cin>>str>>str;//输入第二、三个单词,用不上,直接跳过
}
getchar();//截掉空格
getline(cin,name);//输入名字
namelengthmax=max(namelengthmax,(int)name.size());//更新名字最大长度
if(!mp.count(name)){//如果没有该队的信息,则需要计入其信息
mp[name]=g;//记录该队编号
group[g++].name=name;
}
int index=mp[name];//获取编号
if(group[index].isright[id-'A']){//已通过,剩下的提交不需计入榜单,continue跳出去
cin>>str;
continue;
}
if(flag){//答题正确且为第一次答对
group[index].accept++;//答题正确数+1
group[index].isright[id-'A']=true;//标记该题正确;
group[index].time+=t;//加上用时
group[index].time+=20*group[index].cns[id-'A'];//加上罚题时间
}
else{//答题错误且没答对过本题
group[index].cns[id-'A']++;//记录该题答题次数
}
cin>>str;//输入下一行
}
sort(group,group+g,cmp);
int rank=0;//相对排名
//表头部分
cout<<"Rank Who";
string s=string(namelengthmax-3,' ');
cout<<s;
cout<<" Solved Penalty";
for(int i=0;i<n;i++){
printf(" %c",'A'+i);
}
//各队信息
for(int i=0;i<g;i++){
cout<<endl;
if(!i||!(group[i].accept==group[i-1].accept&&group[i].time==group[i-1].time))
//第一名或不与前一名并列,相对排名加一
rank++;
printf("%4d ",rank);
s=string(namelengthmax-group[i].name.length(),' ');//右对齐
cout<<s<<group[i].name;
printf(" %6d %7d",group[i].accept,group[i].time);
for(int j=0;j<n;j++){
cout<<" ";
int cnt=group[i].cns[j];//获取答题次数
if(group[i].isright[j]){//答对
if(cnt==0) cout<<" +";
else printf(" +%d",cnt);
}
else{//答错或未答
if(cnt==0) cout<<" ";
else printf(" -%d",cnt);
}
}
}
return 0;
}