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

我用了2个内部类来做,一个是输入的类,一个是输出的类。

解析在代码中有。

注意格式!名字除了要占10个字符还要和AC的题目数之间空一格。

题目数和时间也是一样的,之间需要空一格。

package cn.hncu.acm;

import java.util.Arrays;
import java.util.Comparator;
import java.util.Scanner; public class P2093 { public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
answer asr[] = new answer[200];
while(sc.hasNext()){
int n = sc.nextInt();
int t = sc.nextInt();
int a = 0;
int num;//提交正确的题目数
int time;//提交的时间
while(sc.hasNext()){
asr[a] = new answer();
student1 s = new student1();
s.name = sc.next();
// if(s.name.equals("#")){
// break;
// }//自己测试的时候需要有一个结束的,不然自己看不到结果
asr[a].name=s.name;
num =n;
time=0;
s.strMark= new String[n];//必须要new 不然会空指针异常
for(int i=0;i<n;i++){
s.strMark[i] = sc.next();
if(s.strMark[i].charAt(0)=='-'||s.strMark[i].equals("0")){
num--;//如果提交次数为0,或者没有提交通过,则num减一
}else{
//提交通过的
String s1="";//s1是提交的时间
String s2="";//s2是提交错误的次数
boolean isS1 = true;
for(int k=0;k<s.strMark[i].length();k++){
if(isS1){
if(s.strMark[i].charAt(k)=='('){
isS1=false;
continue;
}
s1 = s1+s.strMark[i].charAt(k);
}else{
if(s.strMark[i].charAt(k)==')'){
break;
}
s2 = s2+s.strMark[i].charAt(k);
}
}
//System.out.println("s1="+Integer.parseInt(s1));
//System.out.println("s2="+Integer.parseInt(s2));
if(s2.equals("")){
//如果提交错误次数为0
time+= Integer.parseInt(s1);
}else{
//有提交次数错误的
time += Integer.parseInt(s1)+(Integer.parseInt(s2)*t);
}
}
}
asr[a].time=time;
asr[a].num=num;
a++;
}
Arrays.sort(asr,0,a, new Comparator<answer>() {
@Override
public int compare(answer o1, answer o2) {
//提交正确的题目多的排前面。 if(o1.num>o2.num){
return -1;
}
if(o1.num<o2.num){
return 1;
} //如果提交的正确题目数量是一样的,则time小的排前面。
return o1.time-o2.time;
}
});
for(int i=0;i<a;i++){
System.out.printf("%-10s %2d %4d",asr[i].name,asr[i].num,asr[i].time);
System.out.println();
}
}
}
} class student1 {
//输入的
String name;
String strMark[];
} class answer {
//输出的
String name;
int num;
int time;
}

HDOJ(HDU) 2093 考试排名(Arrays.sort排序、类的应用)的更多相关文章

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

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

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

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

  3. HDU 2093 考试排名 模拟题

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

  4. HDOJ(HDU) 2115 I Love This Game(排序排序、、、)

    Problem Description Do you like playing basketball ? If you are , you may know the NBA Skills Challe ...

  5. Java 使用Arrays.sort排序 从大到小排列

    前言 一般情况,我们在Java中给数组排序,比起自己写个冒泡排序,更加喜欢使用Java中自带的sort方法,也就是Arrays.sort方法 但是,这个方法只会将数组从小到大排列,如果我们需要从大到小 ...

  6. hdoj 3785 寻找大富翁【优先队列+sort排序】

    寻找大富翁 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submi ...

  7. hdu 2093 成绩排名

    思路: 没啥思路,就是定义结构体,跟题目,走,当时没想到对那个括号的处理,后面看了题解,才知道用个getchar直接判断 算是一个值得思考的点. 代码: #include<bits/stdc++ ...

  8. HDOJ(HDU) 2523 SORT AGAIN(推导排序、、)

    Problem Description 给你N个整数,x1,x2-xn,任取两个整数组合得到|xi-xj|,(0 < i,j<=N,i!=j). 现在请你计算第K大的组合数是哪个(一个组合 ...

  9. java.util.Arrays.sort两种方式的排序(及文件读写练习)

    import java.io.*; import java.util.*; public class SortTest{ public static void main(String args[]) ...

随机推荐

  1. Ext入门的第一个程序(1)

    1.Ext是什么? extjs是集UI和ajax框架与一身的,界面又好看,又有很强的ajax交互功能,适合不会做漂亮页面的程序员用的,缺点就是太大了,要导入近800KB左右的js和css文件,这对于w ...

  2. Swift: The Basics

    Swift是类型安全的语言: Swift introduces optional types, which handle the absence of a value. Optional say ei ...

  3. 获取Html中所有img的src

    /// <summary> /// 获取所有Img中的Src /// </summary> /// <param name="htmlText"> ...

  4. mysql查看binlog日志

    1.语法:(用于在二进制日志中显示事件.如果您不指定’log_name’,则显示第一个二进制日志.LIMIT子句和SELECT语句具有相同的语法.) show binlog events [IN 'l ...

  5. C#实现自动切割图片

    由于做一个TD游戏需要一些图片素材,可是现有的从网上下载的<保卫萝卜>的图片资源是多张图片合在一起的,并且没有什么规则,虽然有 个xml文件似乎用来描述此图片内子图片位置大小等信息,但由于 ...

  6. C# Wpf双向绑定实例

    Wpf中双向绑定处理需要两处 实例1: 1.前台Xaml中属性Binding 时Model指定 TwoWay <Grid> <Ellipse x:Name="ellipse ...

  7. C# 各版本更新简介

    经常在不同版本的.net framework下作业.于是乎想了解下,.net下各版本C#的新特性. ---------- C#2.0  针对于.net framework 2.0 新特性有: 分部类 ...

  8. Linux和windows下清除svn保存的账号密码信息

    linux是什么用户登录就是什么用户的home下,如root用户就是/root,如果xiangdong就是/home/xiangdong 用Svn时会有一种需求是需要换个帐号测试一下什么的,但往往有缓 ...

  9. 在Xcode7中安装Alcatraz(Xcode插件管理, 字体主题等)

    第一步:关闭 Xcode.第二步:如果你之前安装过Alcatraz,卸载它.在终端运行命令: rm -rf ~/Library/Application\ Support/Developer/Share ...

  10. 你好,C++(11)如何用string数据类型表示一串文字?根据初始值自动推断数据类型的auto关键字(C++ 11)

    3.5.2  字符串类型 使用char类型的变量我们可以表示单个字符,那么,我们又该如何表示拥有多个字符的字符串呢? 我们注意到,一个字符串是由多个字符串连起来形成的.很自然地,一种最简单直接的方法就 ...