1148: 考试排名

Description

C++编程考试使用的实时提交系统,具有即时获得成绩排名的特点。它的功能是怎么实现的呢?
我们做好了题目的解答,提交之后,要么“AC”,要么错误,不管怎样错法,总是给你记上一笔,表明你曾经有过一次错误提交,因而当你一旦提交该题 “AC”后,就要与你算一算帐了,总共该题错误提交了几回。虽然你在题数上,大步地跃上了一个台阶,但是在耗时上要摊上你共花去的时间。特别是,曾经有过 的错误提交,每次都要摊上一定的单位时间分。这样一来,你在做出的题数上,可能领先别人很多,但是,在做出同样题数的人群中,你可能会在耗时上处于排名的 劣势。
例如:某次考试一共8题(A,B,C,D,E,F,G,H),每个人做的题都在对应的题号下有个数量标记,负数表示该学生在该题上有过的错误提交 次数,但到现在还没有AC,正数表示AC所耗的时间,如果正数a跟上一对括号,里面有个整数b,那就表示该学生提交该题AC了,耗去了时间a,同时,曾经 错误提交了b次,因此对于下述输入数据:
name A B C D E F G H
Smith -1 -16 8 0 0 120 39 0
John 116 -2 11 0 0 82 55(1) 0
Jose 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
若每次错误提交的罚分为20分,则其排名从高到低应该是这样的:
Jose 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


HINT

这道题目主要是用类来存储,并访问进行排序,因为,我感觉这道题目的输出有问题,因此,并没有完全按照题目要求的输出,只是,大概解决了这道题的要求

代码块

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner cn = new Scanner(System.in);
        int n = cn.nextInt();
        int m = cn.nextInt();
        Student[] s = new Student[6];//创建一个学生类
        int k = 0;
        while (cn.hasNext()) {//判断输出是否输入完毕
            int A = 0;
            int B = 0;
            int C = 0;
            String na = cn.next();
            for (int j = 0; j < n; j++) {
                String nb = cn.next();
                if (nb.startsWith("-")) {//进行每一个输入的值进行判断,并做相应的处理

                    int temp = Integer.parseInt(nb);
                    B += Math.abs(temp);
                } else if (nb.endsWith(")")) {
                    int v = nb.indexOf("(");
                    int length = nb.length();
                    String z1 = "";
                    String z2 = "";
                    for (int l = 0; l < v; l++) {
                        z1 += nb.charAt(l);
                    }
                    for (int l = v + 1; l < length - 1; l++) {
                        z2 += nb.charAt(l);
                    }
                    int temp1 = Integer.parseInt(z1);
                    int temp2 = Integer.parseInt(z2);
                    A++;
                    B += temp2;
                    C += temp1;
                } else if (nb.equals("0")) {
                    continue;
                } else {
                    int temp3 = Integer.parseInt(nb);
                    A++;
                    C += temp3;
                }
            }
            s[k] = new Student(na, A, B * m + C);//将输入的每一个考生,存储到学生类中
            k++;
        }
        for (int i = 0; i < k; i++) {//开始进行排序
            for (int j = i; j < k; j++) {
                if (s[i].getAC() < s[j].getAC()) {
                    Student te = s[i];
                    s[i] = s[j];
                    s[j] = te;
                } else if (s[i].getAC() == s[j].getAC()) {
                    if (s[i].getB() > s[j].getB()) {
                        Student te = s[i];
                        s[i] = s[j];
                        s[j] = te;
                    }
                    else if(s[i].getB()==s[j].getB()){
                        if(s[i].getName().compareTo(s[j].getName())>0){
                            Student t = s[i];
                            s[i] = s[j];
                            s[j] = t;
                        }
                    }
                }
            }
        }
        for (Student as : s) {//进行强化for输出
            System.out.println(as);
        }
        cn.close();
    }
}
//建的学生类
class Student {
    private String name;
    private int a;
    private int b;

    public Student(String name, int a, int b) {
        this.name = name;
        this.a = a;
        this.b = b;
    }
    public String getName(){
        return this.name;
    }

    public int getAC() {
        return this.a;
    }

    public int getB() {
        return this.b;
    }

    public String toString() {
        return name + " " + this.a + " " + this.b;
    }

}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值