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\n",stu[i].name,stu[i].n,stu[i].sTime);
78       //%号后加-表示左对齐 ,注意输出后不换行 
79     return 0;
80 }
81             
View Code

 

posted @ 2013-07-19 10:36  xiaxiaosheng  阅读(401)  评论(0编辑  收藏  举报