这道题很有趣!
思路:判断当前队伍是否出现过,然后判断ac还是wa,关键在于每道题ac以及wa的表示,更重要的是把字母题号编写成数字序号,这样好写很多,因此要用一个数组用于标记ac题号,另一个数组用于wa题号
#include<stdio.h>
#include<algorithm>
#include<string.h>
using namespace std;
struct STU
{
int time=0;
int pass=0;
char name[21];
int acname[20];
int fal[20];
};
struct STU stu[100000];
bool cmp(struct STU a,struct STU 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,ifpass,min;
char curname[21],title;
while(scanf("%d %s %c %d",&min,curname,&title,&ifpass)!=EOF)
{
t=0;
//printf("%d %s %c %d",min,curname,title,ifpass);
for(i=0;i<=n-1;i++)
{
if(!strcmp(curname,stu[i].name))
{
t=1;break;
}
}
if(!t)//如果t=0即这个队伍第一次露头
{
strcpy(stu[n].name,curname);
i=n;//i指向这只新队伍,否则用之前找到重名的对应的i
memset(stu[i].acname,0,sizeof(stu[i].acname));
memset(stu[i].fal,0,sizeof(stu[i].fal));
}
if(!ifpass&&stu[i].acname[title-65]!=1)//通过而且不是之前ac过的题
{
stu[i].pass++;//ac题数加一
stu[i].acname[title-65]=1;//标记为已通过
stu[i].time+=stu[i].fal[title-65]*20+min;//之前这一题的罚时加上通过的当前时间
}
else if(ifpass)//没ac
{
stu[i].fal[title-65]++;
}
n++;
}
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);
else break;
}
return 0;
}