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
  • 相关阅读:
    二、缴费证明(完税凭证)开具渠道
    DateTime的具体用法
    获取HTML页面高度和分辨率
    JS获取当前日期及时间
    CSS textindent 属性
    combotree初始化加载折叠
    关于C#中将数字转换为指定格式
    jquery cookie用法(获取cookie值,删除cookie)
    如何在Sql Server中读取最近一段时间的记录,比如取最近3天的或最近3个月的记录。
    定位/定位偏移量
  • 原文地址:https://www.cnblogs.com/xiaxiaosheng/p/3200058.html
Copyright © 2011-2022 走看看