考试排名
Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 3966 Accepted Submission(s): 1364
Problem Description
C++编程考试使用的实时提交系统,具有即时获得成绩排名的特点。它的功能是怎么实现的呢?
我们做好了题目的解答,提交之后,要么“AC”,要么错误,不管怎样错法,总是给你记上一笔,表明你曾经有过一次错误提交,因而当你一旦提交该题“AC”后,就要与你算一算帐了,总共该题错误提交了几回。虽然你在题数上,大步地跃上了一个台阶,但是在耗时上要摊上你共花去的时间。特别是,曾经有过的错误提交,每次都要摊上一定的单位时间分。这样一来,你在做出的题数上,可能领先别人很多,但是,在做出同样题数的人群中,你可能会在耗时上处于排名的劣势。
例如:某次考试一共8题(A,B,C,D,E,F,G,H),每个人做的题都在对应的题号下有个数量标记,负数表示该学生在该题上有过的错误提交次数,但到现在还没有AC,正数表示AC所耗的时间,如果正数a跟上一对括号,里面有个整数b,那就表示该学生提交该题AC了,耗去了时间a,同时,曾经错误提交了b次,因此对于下述输入数据:
若每次错误提交的罚分为20分,则其排名从高到低应该是这样的:
Josephus 5 376
John 4 284
Alice 4 352
Smith 3 167
Bob 2 325
Bush 0 0
Input
输入数据的第一行是考试题数n(1≤n≤12)以及单位罚分数m(10≤m≤20),每行数据描述一个学生的用户名(不多于10个字符的字串)以及对所有n道题的答题现状,其描述采用问题描述中的数量标记的格式,见上面的表格,提交次数总是小于100,AC所耗时间总是小于1000。
Output
将这些学生的考试现状,输出一个实时排名。实时排名显然先按AC题数的多少排,多的在前,再按时间分的多少排,少的在前,如果凑巧前两者都相等,则按名字的字典序排,小的在前。每个学生占一行,输出名字(10个字符宽),做出的题数(2个字符宽,右对齐)和时间分(4个字符宽,右对齐)。名字、题数和时间分相互之间有一个空格。
Sample Input
8 20
Smith -1 -16 8 0 0 120 39 0
John 116 -2 11 0 0 82 55(1) 0
Josephus 72(3) 126 10 -3 0 47 21(2) -2
Bush 0 -1 -8 0 0 0 0 0
Alice -2 67(2) 13 -1 0 133 79(1) -1
Bob 0 0 57(5) 0 0 168 -7 0
Sample Output
Josephus 5 376
John 4 284
Alice 4 352
Smith 3 167
Bob 2 325
Bush 0 0
Author
qianneng
http://acm.hdu.edu.cn/showproblem.php?pid=2093
#include <iostream>
using namespace std;
typedef struct{
char name[20]; //姓名
int actime; //ac时间
int errorNum; //错误提交次数
int total; //总耗时
int acNum; //ac题数
}Pople;
//算法思路:用sscanf进行提取数字,汗,原来没掌握用法,用qsort进行多种情况排序
Pople p[1000];
int cmp(const void * a, const void *b)
{
Pople c = *(Pople *)a;
Pople d = *(Pople *)b;
if(c.acNum != d.acNum)
return (c.acNum - d.acNum) * -1;
else if(c.total != d.total)
return c.total - d.total;
else
return strcmp(c.name, d.name);
}
int main()
{
int n, m, i, j, a, b, ins;
char c[20];
cin>>n>>m;
i = 0;
while(cin>>p[i].name)
{
p[i].actime = 0;
p[i].errorNum = 0;
p[i].acNum = 0;
p[i].total = 0;
for(j = 0; j < n; j++)
{
cin>>c;
ins = sscanf(c, "%d(%d)", &a, &b);
if(ins == 2)
{
p[i].actime += a;
p[i].errorNum += b;
p[i].acNum++;
}else if(ins == 1 && a > 0)
{
p[i].actime += a;
p[i].acNum++;
}
}
p[i].total = p[i].actime + p[i].errorNum * m;
i++;
}
qsort(p, i, sizeof(Pople), cmp);
for(j = 0; j < i; j++)
{
printf("%-10s %2d %4d\n", p[j].name, p[j].acNum, p[j].total);
}
return 0;
}
分享到:
相关推荐
hdu 期末考试复习资料 计算机网络 编译原理 计算机图形学 编译原理 信息安全与技术 数据库应用系统开发
HDU的1250,主要是利用高精度加法,但是代码有点繁琐,效率不是很高
杭电ACMhdu1163
HDU1059的代码
hdu1001解题报告
hdu 1574 passed sorce
HDU的一题........HDU DP动态规
hdu2101AC代码
hdu acm 教案 搜索入门 hdu acm 教案 搜索入门
搜索 dfs 解题代码 hdu1241
hdu 5007 Post Robot 字符串枚举。 暴力一下就可以了。
hdu acm 教案 动态规划(1) hdu acm 教案 动态规划(1)
ACM HDU题目分类,我自己总结的大概只有十来个吧
hdu 1166线段树代码
HDU最全ac代码
自己做的HDU ACM已经AC的题目
hdu动态规划算法集锦
hdu题目分类
HDU图论题目分类
hdu-acm源代码(上百题)hdu-acm源代码、hdu-acm源代码hdu-acm源代码