zoukankan      html  css  js  c++  java
  • HDU 2093 考试排名 模拟题

    解题报告:

    题目描述:写一个程序给一个编程考试C++实时提交系统排名,给你的数据是题目的总数,每次错误提交罚的时间分,每位用户的姓名,然后是输入用户每题的完成情况,有一下几种情况,第一,输入只有一个正值,表示该题只有一次提价记录,且已经AC了,第二,有一个正值,并且,正值后面有一个括号,括号里面有一个数字,前面的正值表示AC该题所用的时间,后面括号里面的数表示总共有多少次错误的提交记录,第三,只有一个负数,表示该题提交了这个负数的绝对值次,但还没有AC,第四,只有一个0,表示该题没有提交记录,对于每一题,如果已经AC了,但是有错误的提交记录,就要将每一次错误的提交记录都罚一定的时间,并且算进总的用时里面。要你给这个比赛结果进行排名,要求是首先按照AC的题数,AC题多的人排前面,如果AC的题目数量相同,则按照总的用时,用时少的人排前面,如果AC题数跟用时都相同的话,按照名字的字典序排列。

    一个模拟题,就是对输入的处理比较麻烦,可以在每次输入一个做题情况时,将输入先做一个预处理,先判断有没有括号。然后还要注意的就是如果有错误的提交但是到最后没有AC,则该题不罚时。输出的时候注意最后没有换行,不然就PE。

     1 #include<cstdio>
     2 #include<cstring>
     3 #include<cmath>
     4 #include<algorithm>
     5 
     6 typedef int INT;
     7 struct node {
     8     char name[100];
    
     9     int n;      //记录过的题数 
    10     int sTime;   //记录总的时间 
    11     node() {
    12         n = sTime = 0;   //将时间和题数初始化 
    13     }
    14 };
    15 bool cmp(node a,node b) {   //排序函数 
    16     if(a.n>b.n)
    17     return true;
    18     else if(a.n<b.n)
    19     return false;
    20     else if(a.n == b.n) {
    21         if(a.sTime<b.sTime)
    22         return true;
    23         else if(a.sTime>b.sTime)
    24         return false;
    25         else if(a.sTime == b.sTime) {
    26             if(strcmp(a.name,b.name)==-1)
    27             return true;
    28             else return false;
    29         }
    30     }
    31 }
    32     
    33 int main( ) {
    34     int n,p;             //p表示做错一题罚的时间分 
    35     scanf("%d%d",&n,&p);
    36     char str[100];
    37     node stu[1005];
    38     int num = 0;
    39     while(scanf("%s",str)!=EOF) {
    40         strcpy(stu[num].name,str);
    41         for(int i = 0;i<n;++i) {
    42             scanf("%s",str);
    43             int len = strlen(str);
    44             int flag = 0,l1,l2;
    45             for(int j = 0;j<len;++j) {    //先做一遍预处理,判断是否存在括号,
    46                    if(str[j] == '(') {        //如果存在,记录前括号跟后括号的位置 
    47                     flag = 1;
    48                     l1 = j;
    49                 }
    50                 if(str[j] == ')')
    51                 l2 = j;
    52             }
    53             if(!flag) {     //对于没有括号的情况的处理 
    54                 if(atoi(str)>0) {
    55                     stu[num].n++;
    56                     stu[num].sTime+=atoi(str);
    57                 }
    58             }
    59             else {     //对于有括号的情况的处理 
    60                 char str1[100],str2[100];
    61                 int s1 = 0;
    62                 for(;s1<l1;++s1)
    63                 str1[s1] = str[s1];
    64                 str1[s1] = NULL;
    65                 s1 = 0;
    66                 for(;s1<l2-l1-1;++s1)
    67                 str2[s1] = str[s1+l1+1];
    68                 str2[s1] = NULL;
    69                 stu[num].n++;
    70                 stu[num].sTime+= atoi(str1)+p*atoi(str2);
    71             }
    72         }
    73         num++;  //学生数加一 
    74     }
    75     std::sort(stu,stu+num,cmp);
    76     for(int i = 0;i<num;++i)
    77     printf("%-10s %2d %4d
    ",stu[i].name,stu[i].n,stu[i].sTime);
    78       //%号后加-表示左对齐 ,注意输出后不换行 
    79     return 0;
    80 }
    81             
    View Code
  • 相关阅读:
    hdu 5387 Clock (模拟)
    CodeForces 300B Coach (并查集)
    hdu 3342 Legal or Not(拓扑排序)
    hdu 3853 LOOPS(概率DP)
    hdu 3076 ssworld VS DDD(概率dp)
    csu 1120 病毒(LICS 最长公共上升子序列)
    csu 1110 RMQ with Shifts (线段树单点更新)
    poj 1458 Common Subsequence(最大公共子序列)
    poj 2456 Aggressive cows (二分)
    HDU 1869 六度分离(floyd)
  • 原文地址:https://www.cnblogs.com/xiaxiaosheng/p/3200058.html
Copyright © 2011-2022 走看看