时间限制: 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
题目来源:http://218.28.220.249:50015/JudgeOnline/problem.php?id=1260
题意概括:
给你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++) { printf("%d %d %d",a[i].time,a[i].name,a[i].tm); printf("%s\n",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; } } } /*for(i=1;i<=n;i++) { printf("%s",nn[f[i]]); printf(" %d %d\n",tt[i],sum[i]); } printf("-----------");*/ 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; } } } /*for(i=1;i<=n;i++) { printf("%s",nn[f[i]]); printf(" %d %d\n",tt[i],sum[i]); }printf("-----------"); */ 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; }