#include

2016年 河南工业大学校赛 A题.饶学妹的比赛

饶学妹的比赛

时间限制: 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≤TimeiTimei+1≤300,1≤IDin,1≤PIDik,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 ; 
} 

 

posted @ 2017-11-23 19:21  0一叶0知秋0  阅读(223)  评论(0编辑  收藏  举报