题目链接:
https://nuoyanli.com/contest/27/problem/H
题面:
题意:
一开始输入一个整数T,代表T组测试数据。每组测试数据的第一行有三个整数n,m,k分别表示n个人参加比赛,有m道题,k条提交记录,接下来有k行,表示k条提交记录,每条提交记录由三个整数a,b,c和字符串d组成,a表示提交时间(单位分钟),b表示提交人的编号,c表示提交问题的编号,d表示提交状态。接下来通过这些数据,来判断cxk是否获得第一名,如果为第一名,则输出WAAAAA,否则就输出第一名的编号。
思路:
这道题目明显属于一道结构体的题目,我们首先需要定义一个结构体来存储一系列有关联的变量,这道题目需要存储的就有比赛者的编号以及其答对的题目,所用的总时间,所罚时的总时长,以及是否答对题目这几个有关联的变量。我们就将其定义在一个结构体中,之后我们就正常输入题目所需要输入的值,对于输入的提交信息,我们需要对其进行处理,我们要判断这提交信息是否答题已经正确,若已经正确,则知道题目所用的时间就已经是一个确定值,将罚时与提交时间相加就可以了,如果未答对,就对其罚时进行处理,每次打错罚时20分钟(注:如果此题从头到尾都没有答对,就不需要将其存入总时间中),然后处理完k组提交信息之后,定义一个函数来决定sort排序的规律,先根据题量再根据时长,然后进行排序,之后就可以判断编号为1的cxk是否获得第一名,这道题目的要求也就解决了!!!参考代码如下:
参考代码:
#include<stdio.h>
#include<string.h>
#include<math.h>
#include<stdlib.h>
#include<algorithm>
using namespace std
;
char s
[10000];
struct people
{
int id
;
int sum_n
;
int sum_time
;
int fan_time
[1000];
int TF
[1000];
} temp
[10000];
bool cmp(people a
,people b
)
{
if(a
.sum_n
==b
.sum_n
)
{
return a
.sum_time
<b
.sum_time
;
}
return a
.sum_n
>b
.sum_n
;
}
int main()
{
int n
,m
,k
;
int T
;
scanf("%d",&T
);
while(T
--)
{
memset(temp
,0,sizeof(temp
));
scanf("%d%d%d",&n
,&m
,&k
);
int a
,b
,c
;
for(int i
=1; i
<=k
; i
++)
{
scanf("%d%d%d%s",&a
,&b
,&c
,s
);
temp
[b
].id
=b
;
if(s
[0]=='A'&&(temp
[b
].TF
[c
]==0))
{
temp
[b
].TF
[c
]=1;
temp
[b
].sum_time
+=(temp
[b
].fan_time
[c
]+a
);
temp
[b
].sum_n
++;
}
else
{
temp
[b
].fan_time
[c
]+=20;
}
}
sort(temp
+1,temp
+1+n
,cmp
);
if(temp
[1].id
==1)
printf("WAAAAA\n");
else
printf("%d\n",temp
[1].id
);
}
}