HDU 2093 考试排名 模拟题
2013-07-19 10:36
309 查看
解题报告:
题目描述:写一个程序给一个编程考试C++实时提交系统排名,给你的数据是题目的总数,每次错误提交罚的时间分,每位用户的姓名,然后是输入用户每题的完成情况,有一下几种情况,第一,输入只有一个正值,表示该题只有一次提价记录,且已经AC了,第二,有一个正值,并且,正值后面有一个括号,括号里面有一个数字,前面的正值表示AC该题所用的时间,后面括号里面的数表示总共有多少次错误的提交记录,第三,只有一个负数,表示该题提交了这个负数的绝对值次,但还没有AC,第四,只有一个0,表示该题没有提交记录,对于每一题,如果已经AC了,但是有错误的提交记录,就要将每一次错误的提交记录都罚一定的时间,并且算进总的用时里面。要你给这个比赛结果进行排名,要求是首先按照AC的题数,AC题多的人排前面,如果AC的题目数量相同,则按照总的用时,用时少的人排前面,如果AC题数跟用时都相同的话,按照名字的字典序排列。
一个模拟题,就是对输入的处理比较麻烦,可以在每次输入一个做题情况时,将输入先做一个预处理,先判断有没有括号。然后还要注意的就是如果有错误的提交但是到最后没有AC,则该题不罚时。输出的时候注意最后没有换行,不然就PE。
View Code
题目描述:写一个程序给一个编程考试C++实时提交系统排名,给你的数据是题目的总数,每次错误提交罚的时间分,每位用户的姓名,然后是输入用户每题的完成情况,有一下几种情况,第一,输入只有一个正值,表示该题只有一次提价记录,且已经AC了,第二,有一个正值,并且,正值后面有一个括号,括号里面有一个数字,前面的正值表示AC该题所用的时间,后面括号里面的数表示总共有多少次错误的提交记录,第三,只有一个负数,表示该题提交了这个负数的绝对值次,但还没有AC,第四,只有一个0,表示该题没有提交记录,对于每一题,如果已经AC了,但是有错误的提交记录,就要将每一次错误的提交记录都罚一定的时间,并且算进总的用时里面。要你给这个比赛结果进行排名,要求是首先按照AC的题数,AC题多的人排前面,如果AC的题目数量相同,则按照总的用时,用时少的人排前面,如果AC题数跟用时都相同的话,按照名字的字典序排列。
一个模拟题,就是对输入的处理比较麻烦,可以在每次输入一个做题情况时,将输入先做一个预处理,先判断有没有括号。然后还要注意的就是如果有错误的提交但是到最后没有AC,则该题不罚时。输出的时候注意最后没有换行,不然就PE。
#include<cstdio> #include<cstring> #include<cmath> #include<algorithm> typedef int INT; struct node { char name[100]; int n; //记录过的题数 int sTime; //记录总的时间 node() { n = sTime = 0; //将时间和题数初始化 } }; bool cmp(node a,node b) { //排序函数 if(a.n>b.n) return true; else if(a.n<b.n) return false; else if(a.n == b.n) { if(a.sTime<b.sTime) return true; else if(a.sTime>b.sTime) return false; else if(a.sTime == b.sTime) { if(strcmp(a.name,b.name)==-1) return true; else return false; } } } int main( ) { int n,p; //p表示做错一题罚的时间分 scanf("%d%d",&n,&p); char str[100]; node stu[1005]; int num = 0; while(scanf("%s",str)!=EOF) { strcpy(stu[num].name,str); for(int i = 0;i<n;++i) { scanf("%s",str); int len = strlen(str); int flag = 0,l1,l2; for(int j = 0;j<len;++j) { //先做一遍预处理,判断是否存在括号, if(str[j] == '(') { //如果存在,记录前括号跟后括号的位置 flag = 1; l1 = j; } if(str[j] == ')') l2 = j; } if(!flag) { //对于没有括号的情况的处理 if(atoi(str)>0) { stu[num].n++; stu[num].sTime+=atoi(str); } } else { //对于有括号的情况的处理 char str1[100],str2[100]; int s1 = 0; for(;s1<l1;++s1) str1[s1] = str[s1]; str1[s1] = NULL; s1 = 0; for(;s1<l2-l1-1;++s1) str2[s1] = str[s1+l1+1]; str2[s1] = NULL; stu[num].n++; stu[num].sTime+= atoi(str1)+p*atoi(str2); } } num++; //学生数加一 } std::sort(stu,stu+num,cmp); for(int i = 0;i<num;++i) printf("%-10s %2d %4d\n",stu[i].name,stu[i].n,stu[i].sTime); //%号后加-表示左对齐 ,注意输出后不换行 return 0; }
View Code
相关文章推荐
- HDU 2093-考试排名(模拟题)
- hdu 2093 考试排名
- HDU 2093 考试排名
- HDU 2093 考试排名
- HDU——2093考试排名(string类及其函数的运用以及istringstream)
- HDU 2093 考试排名
- 【HDU】2093 - 考试排名(结构体排序)
- 【HDU 2093】考试排名
- HDU--杭电--2093--考试排名--结构体排序
- HDU 2093考试排名
- 【hdu 2093】 考试排名
- HDU ACM 2093 考试排名
- hdu 2093 考试排名
- hdu 2093 考试排名 解题报告
- HDU 2093 考试排名
- hdu 2093 考试排名
- hdu---2093考试排名
- hdu 2093 考试排名
- hdu 2093 考试排名
- hdu 2093 考试排名