考试排名

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. KMP该算法解释(最长公共子)

    一个:介绍KMP算法之前,首先解释一下BF算法 (1)BF算法(传统的匹配算法,是最简单的算法) BF算法是一种常见的模式匹配算法,BF该算法的思想是目标字符串S模式串的第一个字符P的第一个字符,以匹 ...

  2. Git常用操作汇总(转)

    如果一个文件被删除了,可以使用切换版本号进行恢复.恢复方法: 先确定需要恢复的文件要恢复成哪一个历史版本(commit),假设那个版本号是: commit_id,那么 git checkout com ...

  3. 两年前实习时的文档——MMC学习总结

    1概述 驱动程序实际上是硬件与应用程序之间的中间层.在Linux操作系统中,设备驱动程序对各种不同的设备提供了一致的訪问接口,把设备映射成一个特殊的设备文件,用户程序能够像其它文件一样对设备文件进行操 ...

  4. 实现键值对存储(三):Kyoto Cabinet 和LevelDB的架构比較分析

    译自  Emmanuel Goossaert (CodeCapsule.com) 在本文中,我将会逐组件地把Kyoto Cabinet 和 LevelDB的架构过一遍.目标和本系列第二部分讲的差点儿相 ...

  5. [ACM] POJ 3252 Round Numbers (的范围内的二元0数大于或等于1数的数目,组合)

    Round Numbers Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 8590   Accepted: 3003 Des ...

  6. java中System类简介(转)

    上次面试中遇到的一个问题,问到System.out.println()中的out是不是内部类[不是内部类],当时就给问蒙了,直观感觉out应该是System类的一个属性,跟内部类有什么关系?而且之前整 ...

  7. 数组、链表、Hash(转)

    在程序中,存放指定的数据最常用的数据结构有两种:数组和链表. 数组和链表的区别: 1.数组是将元素在内存中连续存放. 链表中的元素在内存中不是顺序存储的,而是通过存在元素中的指针联系到一起. 2.数组 ...

  8. android工程实现换壁纸功能(转)

    最近工作要实现换壁纸小功能,将代码做成demo发出来 没有采用zip格式换肤,因为只是更换一张图片背景 1.将三张图放入drawable-hdpi,我放的是480*800的 2.用sharedPref ...

  9. 配置主机路由表(route)(两)

    我们谈到了路由在互联网为基础的时间问题,必须有一个路径之间的两个主机可通信 TCP/IP 合约,否则就不能是有线啊! 一般来说.只要有一个网络接口,的接口将产生的路由.例如,在哥斯达黎加的内部主机鸟有 ...

  10. sql多表查询之一:Where 和 On的秘密

    原文 sql多表查询之一:Where 和 On的秘密 对于还在SQL初级阶段的朋友来说,sql多表查询问题是一个比较有趣也容易出错的技术.什么时候会用到sql多表查询呢?是在两张或两张以上表单中通过某 ...