考试排名

Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 2444 Accepted Submission(s): 864
 
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),每行数据描写叙述一个学生的username(不多于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
 

解析:这道题在杭电上属于简单题,可是做起来好麻烦。最恶心的就是格式问题了,只是涉及的东西还比較多,我认为不失为经典题哈!
#include <iostream>
#include <string>
#include <algorithm>
#include <iomanip>
using std::endl;
using std::cin;
using std::cout;
using std::string;
using std::sort;
using std::setw;
using std::ios;
const int MAXN = 1000;
struct student{
string name;
int numSolved;
int time;
}stu[MAXN];
//处理字符串的函数
int strtoint(string s , int penaltyTime)
{
int value=0 , sum=0;
for(int i=0; i<s.length(); ++i)
{
if(s[i]=='(')
{
sum+=value;
value = 0;
}else if(s[i]==')')
{
sum+=(value*penaltyTime);
}else{
value=value*10+(s[i]-'0');
}
}
return sum > value ? sum:value;
}
//排序函数
bool cmp(student a , student b)
{
if(a.numSolved > b.numSolved)
return true;
if(a.numSolved == b.numSolved)
return a.time < b.time;
if(a.numSolved==b.numSolved && a.time == b.time)
return a.name < b.name;
return false;
}
int main()
{
#ifdef LOCAL
freopen("input.txt" , "r" , stdin);
#endif
int n , penaltyTime;
cin >> n >> penaltyTime;
string name , str;
int m = 0;
//输入
while(cin >> name)
{
stu[m].name = name;
for(int i=0; i<n; ++i)
{
cin >> str;
if(str[0] >'0')
{
stu[m].numSolved++;
stu[m].time += strtoint(str , penaltyTime);
}
}
m++;
}
//排序
sort(stu , stu+m , cmp);
//输出
for(int i=0; i<m; ++i)
{
//控制左对齐
cout.flags(ios::left);
//控制占用字符
cout << setw(10) << stu[i].name << " ";
//控制右对齐
cout.flags(ios::right);
//控制字符和输出格式
cout << setw(2) << stu[i].numSolved << " ";
cout << setw(4) << stu[i].time;
cout << endl;
}
return 0;
}


HDU2093--考试排名的更多相关文章

  1. hdu2093 考试排名(还需完善)

    下面代码是借鉴的.好多的知识点等着完善 #include <iostream> #include <string> #include <algorithm> usi ...

  2. HDU——2093考试排名(string类及其函数的运用以及istringstream)

    考试排名 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submi ...

  3. HDOJ(HDU) 2093 考试排名(Arrays.sort排序、类的应用)

    Problem Description C++编程考试使用的实时提交系统,具有即时获得成绩排名的特点.它的功能是怎么实现的呢? 我们做好了题目的解答,提交之后,要么"AC",要么错 ...

  4. 5N - 考试排名

    C++编程考试使用的实时提交系统,具有即时获得成绩排名的特点.它的功能是怎么实现的呢? 我们做好了题目的解答,提交之后,要么“AC”,要么错误,不管怎样错法,总是给你记上一笔,表明你曾经有过一次错误提 ...

  5. B - 考试排名

    C++编程考试使用的实时提交系统,具有即时获得成绩排名的特点.它的功能是怎么实现的呢? 我们做好了题目的解答,提交之后,要么"AC",要么错误,不管怎样错法,总是给你记上一笔,表明 ...

  6. HDU 2093 考试排名 模拟题

    解题报告: 题目描述:写一个程序给一个编程考试C++实时提交系统排名,给你的数据是题目的总数,每次错误提交罚的时间分,每位用户的姓名,然后是输入用户每题的完成情况,有一下几种情况,第一,输入只有一个正 ...

  7. 题解报告:hdu 2093 考试排名

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2093 Problem Description C++编程考试使用的实时提交系统,具有即时获得成绩排名的 ...

  8. HD-ACM算法专攻系列(16)——考试排名

    问题描述: 源码: 主要要注意输出格式. #include"iostream" #include"iomanip" #include"algorith ...

  9. ZJNU 1164 - 考试排名——中级

    1.如果一个单元为0,表示没做过这题,不计入成绩 2.如果一个单位为负数,表示做错了这题,不计入成绩 所以只要一个单元为正数(不论是否有括号)都说明做出了这一题,计入成绩 将名字和成绩都当作字符串读入 ...

  10. HDU2093 字符串2种不错的读入思路

    <span style="font-family: 'Times New Roman'; font-size: 12px; background-color: rgb(255, 255 ...

随机推荐

  1. 朝花夕拾-4-shell

    引言 shell,我们常常会用到,以其强大的功能,会帮助我们解决非常多棘手的问题.近期遇到一个问题,要跑非常多case,假设串行的执行,须要非常久.能不能让他们并行起来,但又不能全部case都并行执行 ...

  2. IP地址和子网掩码

    A分类IP住址 在第一个领域值规模:0-127  默认子网掩码:255.0.0.0 B分类IP就拿地址的第一个字段值范围:128-191  默认的子网掩码255.255.0.0 C类IP地址的第一个字 ...

  3. springMVC3得知(五岁以下儿童)--MultiActionController

    Spring为了提供一个多动作控制器,您可以使用它的几个行动统一到一个控制器,这可以放在一起功能. 多动作控制器存在在一个单独的包中--org.springframework.web.mvc.mult ...

  4. MySQL当您插入列无效的数据插入

    1.错误叙述性说明 com.mysql.jdbc.exception:jdbc4.MySQLSyntaxErrorException:Unknown column 'man' in 'field li ...

  5. ASP.NET AJAX简明教程

     当我们谈论Ajax时,首先想到的就是JavaScript下的Ajax,用来完成网页的交互,局部刷新工作,Microsoft的ASP.NET AJAX框架在Web的开发中承担着类似的角色,并简化了Ja ...

  6. 第23章 访问者模式(Visitor Pattern)

    原文 第23章 访问者模式(Visitor Pattern) 访问者模式 导读:访问者模式是我个人认为所有行为模式中最为复杂的一种模式了,这个模式可能看一遍会看不懂,我也翻了好几个例子,依然不能很好的 ...

  7. paramiko socket.error: Int or String expected

    paramiko socket.error: Int or String expected paramiko的环境: Python 2.6.6 paramiko==1.14.0 正常的paramiko ...

  8. oracle_windows下命令启动oracle监听和服务

    1.检查监听器状态 C:\Users\Administrator>lsnrctl status 2.启动监听程序 C:\Users\Administrator>lsnrctl start ...

  9. SP服务商收益究竟有多大?

    揭秘spspsp服务商怎样盈利?代办sp服务商又称持增值电信----移动网信息服务许可证信息提供商,sp主要业务有短信彩信(手机报.短信群发.客服系统).WAP.彩铃.IVR.百宝箱.JAVA游戏.B ...

  10. Shuttle ESB

    Shuttle ESB(六)——在项目中的应用 如果说你认真看了前面几篇关于ESB的介绍,我相信,在这一篇文章中,你将会找到很多共鸣. 尽管,市面上开源的ESB确实非常之多,像Java中的Mule E ...