河工大玲珑校赛 饶学妹的比赛

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了河工大玲珑校赛 饶学妹的比赛相关的知识,希望对你有一定的参考价值。

饶学妹的比赛
时间限制: 1 秒 内存限制: 64 MB
提交: 363 解决: 116
提交 状态
题目描述
饶学妹组织了一场ACM赛制的比赛,大家纷纷慕名来参加。比赛中大家交题只会有两种结果:AC,WA。比赛结束了,饶学妹制作榜单啦。首先按AC题目的数目(重复AC一道题只算一次)从多到少排名;AC题目数目相同的同学按罚时(罚时计算方式为:单题罚时 = (首次AC该题目时间 + 首次AC之前WA的次数 * 20) min,总罚时 = 各题罚时之和;即某题目AC之后,对这道题目后续的提交均不计入罚时)从少到多排列;AC数目相同且罚时也相同的同学,按编号从小往大排序。
输入


第一行为n,m,k(1≤n≤1000,1≤m≤10000,1≤k≤10),分别表示参加比赛的人数、提交总次数和总题数。
之后一行为n个用空格分隔的字符串,表示n位参赛选手的姓名(每个字符串长度均不超过20,且仅含小写字母);
之后m行,每行均为 Timei IDi PIDi Resulti,(1≤Timei≤Timei+1≤300,1≤IDi≤n,1≤PIDi≤k,Resulti="AC"/"WA"),表示编号为IDi的选手在Timei时刻提交了编号为PIDi的题目,且结果为Resulti.


输出
输出n行,按排名从高到低排列。每行分别输出该选手的姓名,过题数,总罚时,中间均为一个空格间隔。
样例输入
5 11 10
phx lsf zk rqy ch
1 1 1 AC
1 1 2 AC
2 1 3 AC
2 1 4 AC
3 2 2 WA
4 2 2 AC
5 3 2 AC
10 5 1 WA
20 5 2 WA
30 5 3 WA
40 5 4 WA
样例输出
phx 4 6
zk 1 5
lsf 1 24
rqy 0 0
ch 0 0

 


题意概括:
给你n个同学的在oj上的做题情况,根据题数,罚时排序。
解题思路:
把这m次提交情况都放入一个结构体内,然后计算每个人做对每题的用时和罚时之和,和做题数量,然后写三个循环排序,分别按照做题数目,时间,学号排序。
错误分析:
对那些开始做错最后又AC的题的罚时应该每题分开加,当时少些了一点把所有罚时加一起了。

代码:
#include<stdio.h>
#include<string.h>
struct p
{
int time;
int name;
int tm;
char s[50];
};
int main()
{
struct p a[10100],t;
int i,j,k,l,y,u,v,m,n,f[10100],b[1010][101],tt[10100],sum[10100],sum2[1010][50];
char nn[10100][50],c;
while(scanf("%d%d%d",&n,&m,&k)!=EOF)
{
memset(b,0,sizeof(b));
memset(f,0,sizeof(f));
memset(tt,0,sizeof(tt));
memset(sum,0,sizeof(sum));
memset(sum2,0,sizeof(sum2));
for(i=1;i<=n;i++)
{
scanf("%s",nn[i]);
f[i]=i;
}
for(i=0;i<m;i++)
{
scanf("%d%d%d",&a[i].time,&a[i].name,&a[i].tm);
scanf("%s",a[i].s);
}

for(i=0;i<m;i++)
{
for(j=1;j<=n;j++)
{
if(a[i].name==j&&b[j][a[i].tm]==0&&a[i].s[0]==‘A‘)
{
sum[j]+=a[i].time+sum2[j][a[i].tm];
b[j][a[i].tm]=1;
tt[j]++;
}
if(a[i].name==j&&b[j][a[i].tm]==0&&a[i].s[0]==‘W‘)
{
sum2[j][a[i].tm]+=20;

}

}
}

for(i=1;i<=n-1;i++)
{
for(j=1;j<=n-i;j++)
{
if(tt[j]<tt[j+1])
{
y=tt[j];tt[j]=tt[j+1];tt[j+1]=y;
u=sum[j];sum[j]=sum[j+1];sum[j+1]=u;
v=f[j];f[j]=f[j+1];f[j+1]=v;

}
}
}

y=0;u=0;v=0;
for(i=1;i<=n-1;i++)
{
for(j=1;j<=n-i;j++)
{
if(tt[j]==tt[j+1]&&sum[j]>sum[j+1])

{
u=sum[j];sum[j]=sum[j+1];sum[j+1]=u;
y=tt[j];tt[j]=tt[j+1];tt[j+1]=y;

v=f[j];f[j]=f[j+1];f[j+1]=v;
}
}
}

y=0;u=0;v=0;
for(i=1;i<=n-1;i++)
{
for(j=1;j<=n-i;j++)
{
if(tt[j]==tt[j+1]&&sum[j]==sum[j+1]&&f[j]>f[j+1])
{
y=tt[j];tt[j]=tt[j+1];tt[j+1]=y;
u=sum[j];sum[j]=sum[j+1];sum[j+1]=u;
v=f[j];f[j]=f[j+1];f[j+1]=v;
}
}
}
for(i=1;i<=n;i++)
{
printf("%s",nn[f[i]]);
printf(" %d %d\n",tt[i],sum[i]);
}


}

return 0;
}

以上是关于河工大玲珑校赛 饶学妹的比赛的主要内容,如果未能解决你的问题,请参考以下文章

河南工业大学2017校赛题解

2017河南工业大学ACM邀请赛A题

“玲珑杯”ACM比赛 Round #18

“玲珑杯”算法比赛 Round #14题目与标程

“玲珑杯”ACM比赛 Round #19

“玲珑杯”ACM比赛 Round #1