• 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
    " , num[i].name , num[i].AC_num , num[i].time_sum ) ; 
            }
        }
        
        return 0 ; 
    } 
  • 相关阅读:
    在 windows 系统中使用 redis
    excel公式固定与同一个单元格进行计算
    Emmet快速生成HTML代码的常用语法总结
    手写js中的bind
    JS实现瀑布流页面布局
    010drawio使用流程图,树形图和思维导图的自动布局形状
    Fluentd 使用 multiline 解析器来处理多行日志
    tar 命令压缩时报错 tar: Removing leading `/' from member names
    将 Docker Engine 节点从 dockershim 迁移到 cridockerd
    在 Kubernetes 集群中使用 NodeLocal DNSCache
  • 原文地址:https://www.cnblogs.com/yi-ye-zhi-qiu/p/7886559.html
Copyright © 2020-2023  润新知