考试排名

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. Sql示例说明如何分组后求中间值--【叶子】

    原文:Sql示例说明如何分组后求中间值--[叶子] 这里所谓的分组后求中间值是个什么概念呢? 我举个例子来说明一下: 假设我们现在有下面这样一个表: type        name price -- ...

  2. 谈到一些传统的企业网站SEO问题领域

    在网络营销中的时间越长,有时候,企业网站还是有一些传统做法不解.也许,这是它的思想的局限.比如,我最近来到了一个新的工作环境中发现,虽然公司是专业从事传统渠道已经很不错了,但对于网络营销渠道还有改进的 ...

  3. bzoj 2109 &amp; 2535 空中管制 解读

    [] [分析]小猪真的是一个很好的问题.我认为这是一个问题洪水.建立拓扑后(便! ).直接把最外层设定序号为1,第二层为2.bfs下去就可以. . . 结果发现:飞行序号不能同样.. . 于是開始想. ...

  4. hibernate学习笔记(1)hibernate基本步骤

    hibernate基本步骤 1.创hibernate置对象 Configuration config = newConfiguration(); config.configure("hibe ...

  5. Oracle常见操作汇总(转)

    前言:Oracle学习也有十几天了,但是呢,接下来还要学习许多其他的东西,并不能提步不前,所以在此总结了以下Oracle中常用的命令和语句,没有语法都是实例,以便以后工作的时候随时翻看,毕竟是自己的东 ...

  6. Display Database Image using MS SQL Server 2008 Reporting Services

    原文 Display Database Image using MS SQL Server 2008 Reporting Services With the new release of MS SQL ...

  7. Effective C++学习笔记(Part One:Item 1-4)

    最近的最终effectvie C++仔细阅读侧,我很惊讶C++动力和魅力.最近的" LL最近记得阅读体验和读书笔记其.必要查找使用,是什么假设总结不合适.欢迎批评: 如今仅仅列出框架,近期会 ...

  8. GPS坐标互转:WGS-84(GPS)、GCJ-02(Google地图)、BD-09(百度地图)[转]

    WGS-84:是国际标准,GPS坐标(Google Earth使用.或者GPS模块)GCJ-02:中国坐标偏移标准,Google Map.高德.腾讯使用BD-09:百度坐标偏移标准,Baidu Map ...

  9. hdu1086(线段相交)

    题目意思: 给出n个线段,推断这n条线段中,线段相交的对数. http://acm.hdu.edu.cn/showproblem.php?pid=1086 题目分析: 此题主要写出推断线段相交的函数, ...

  10. NYoj The partial sum problem(简单深搜+优化)

    题目链接:http://acm.nyist.edu.cn/JudgeOnline/problem.php?pid=927 代码: #include <stdio.h> #include & ...