饶学妹的比赛
时间限制: 1 秒 内存限制: 64 MB | 提交: 385 解决: 120
题目描述
饶学妹组织了一场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
思路 : 按照 题意模拟一下 再排序就好了 , 注意 排序过程中 会打断 序号排序 , 需要显示 (按照序号)排序
#include <cstdio> #include <iostream> #include <algorithm> #include <cstring> using namespace std ; #define maxn 2000 int n , m , k ; struct node { char name[50] ; int order ; int AC_num ; bool AC_visit[20] ; int WA_times[20] ; int time_sum ; }; node num[maxn] ; bool cmp(node a , node b){ if(a.AC_num != b.AC_num){ return a.AC_num > b.AC_num ; } else if(a.time_sum!=b.time_sum){ return a.time_sum<b.time_sum; } else return a.order < b.order ; } int main(){ int timei , idi , pidi ; char result[10] ; while(~scanf("%d %d %d" , &n , &m , &k)){ for(int i=1 ; i<=n ; i++){ num[i].AC_num = 0 ; memset(num[i].AC_visit , false , sizeof(num[i].AC_visit)) ; memset(num[i].WA_times , 0 ,sizeof(num[i].WA_times)) ; num[i].time_sum = 0 ; } for(int i=1 ; i<=n ; i++){ scanf("%s" , num[i].name) ; num[i].order = i ; } for(int i=1 ; i<=m ; i++){ scanf("%d %d %d %s" , &timei , &idi , &pidi , result) ; if(result[0] =='W'){ num[idi].WA_times[pidi] ++ ; } else if(result[0] == 'A' && !num[idi].AC_visit[pidi]){ num[idi].AC_num ++ ; num[idi].time_sum += num[idi].WA_times[pidi] * 20 + timei ; num[idi].AC_visit[pidi] = true ; } } sort(num+1 , num+1+n , cmp) ; for(int i=1 ; i<=n ; i++){ printf("%s %d %d\n" , num[i].name , num[i].AC_num , num[i].time_sum ) ; } } return 0 ; }