WAAAAA

mac2024-07-27  20

题目链接:

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);//输入T组数据。 while(T--) { memset(temp,0,sizeof(temp));//将结构体中的元素全部清0。 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))//判断这道题目是否已经被AC或者刚好AC,第二个条件就是判断这道题目是否已经被AC的语句,若已经被AC则不为0. { temp[b].TF[c]=1;//标记这道题目已经被答对。 temp[b].sum_time+=(temp[b].fan_time[c]+a);//将此题的罚时时间和提交时间得出总时间。 temp[b].sum_n++;//答对的题量进行+1。 } else//此种情况为答错的情况。 { temp[b].fan_time[c]+=20;//每次答错增加罚时20分钟。 } }//注:我们将做对一道题目的总时间存储在temp[b].sum_time中,根据代码我们可以看出,当这道题目从始至终没有被答对时,我们始终没有运行if中的语句,就也没有将时间存储在其中,我们就实现只将做对的题目存储其总时间。 sort(temp+1,temp+1+n,cmp);//通过sort排序按所定义的函数进行排序。 if(temp[1].id==1)//当第一名的编号为cxk的编号时,输出WAAAAA。 printf("WAAAAA\n"); else//其他情况输出第一名的编号。 printf("%d\n",temp[1].id); } }
最新回复(0)