HDOJ(HDU) 2093 考试排名(Arrays.sort排序、类的应用)
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排序、类的应用)的更多相关文章
- HDU——2093考试排名(string类及其函数的运用以及istringstream)
考试排名 Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submi ...
- 题解报告:hdu 2093 考试排名
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2093 Problem Description C++编程考试使用的实时提交系统,具有即时获得成绩排名的 ...
- HDU 2093 考试排名 模拟题
解题报告: 题目描述:写一个程序给一个编程考试C++实时提交系统排名,给你的数据是题目的总数,每次错误提交罚的时间分,每位用户的姓名,然后是输入用户每题的完成情况,有一下几种情况,第一,输入只有一个正 ...
- HDOJ(HDU) 2115 I Love This Game(排序排序、、、)
Problem Description Do you like playing basketball ? If you are , you may know the NBA Skills Challe ...
- Java 使用Arrays.sort排序 从大到小排列
前言 一般情况,我们在Java中给数组排序,比起自己写个冒泡排序,更加喜欢使用Java中自带的sort方法,也就是Arrays.sort方法 但是,这个方法只会将数组从小到大排列,如果我们需要从大到小 ...
- hdoj 3785 寻找大富翁【优先队列+sort排序】
寻找大富翁 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submi ...
- hdu 2093 成绩排名
思路: 没啥思路,就是定义结构体,跟题目,走,当时没想到对那个括号的处理,后面看了题解,才知道用个getchar直接判断 算是一个值得思考的点. 代码: #include<bits/stdc++ ...
- HDOJ(HDU) 2523 SORT AGAIN(推导排序、、)
Problem Description 给你N个整数,x1,x2-xn,任取两个整数组合得到|xi-xj|,(0 < i,j<=N,i!=j). 现在请你计算第K大的组合数是哪个(一个组合 ...
- java.util.Arrays.sort两种方式的排序(及文件读写练习)
import java.io.*; import java.util.*; public class SortTest{ public static void main(String args[]) ...
随机推荐
- iPad横竖屏代码适配
你可能非常了解用不同的方式去适配不同尺寸的iPhone屏幕,在适配iPhone屏幕时你需要考虑的只是屏幕大小变化带来的UI元素间隔的变化,但是在iPad上主要针对的是横竖屏下完全不同的UI元素的布局, ...
- codevs4189字典(字典树)
/* 本字典树较弱 只支持插入单词 查询单词. 特殊的 bool变量w 标记此字母是不是某个单词的结束 (然而这个题并没卵用) */ #include<iostream> #include ...
- 学习CSS一些事(下)
2.浮动(float) 浮动(float)特点:1.元素会左移.右移,直到触碰到容器为止. 2.设置浮动元素,仍旧处于标准文档流. 3.当元素没有设置宽度值,而设置了浮动属性,元素的宽度随着内容 ...
- PHP 实现ajax的接收
Ajax界面: 首先,理解本质,就是普通的一个提交在无刷新的情况下发出请求后得到响应,然后去针对你需要 的情况来做行为. <!DOCTYPE html> <html> < ...
- Web.Config文件中添加数据库配置文件
1获取所有配置文件节点的类ConfigurationManager 2数据库节点<ConnectionStrings> <add> name ="Sqlconnect ...
- for update和for update nowait的区别和使用
首先,for update 和for update nowait 是对操作的数据行进行加锁,在事务提交前防止其他操作对数据的修改. for update 和for update nowait主要区别在 ...
- CocoaPods使用详细说明(转)
一.概要 iOS开发时,项目中会引用许多第三方库,CocoaPods(https://github.com/CocoaPods/CocoaPods)可以用来方便的统一管理这些第三方库. 二.安装 由于 ...
- MySQL被Oracle并购后的409个日日夜夜
2009年4月20日,Oracle并购了Sun,这也意味着MySQL归属到甲骨文的旗下.四百多天过去了,究竟这场并购结局如何?请看本文. 去年对Sun的收购,让甲骨文顺利的将一个潜在的对手MySQL收 ...
- IDEA中Maven管理下添加mysql依赖
在做Java Web项目的时候,不可避免的就要使用到数据库,下面就是在IDEA中添加mysql依赖的方法. 如果你看到这里,就表示你弄懂了IDEA,maven和Tomcat等,所以... 只需要在po ...
- MPICH2在两台Ubuntu上安装
本文在经过大量的实验终于不负众望成功的在两台Ubuntu 12.04上部署MPI的一个小型集群,MPICH2所用版本为mpich2-1.4.1,下载地址:http://www.mcs.anl.gov/ ...