ECNU 2977 成绩排序

ECNU 2977 成绩排序

链接

https://acm.ecnu.edu.cn/problem/2977

题目

单点时限: 2.0 sec

内存限制: 256 MB

C 语言课程的上机考试有 M 道题目,从第 1 题至第 M 题每道题的分值为 均为大于的正整数

现给定分数线,请编写程序输出不低于该分数线的学生人数,并将他 (她) 们的成绩按降序输出,若有多名学生考试成绩相同,则按他 (她) 们学号的升序输出。

输入格式
第 1 行:一个整数 () 为问题数。

对于每组测试数据:

第 行是三个正整数:学生人数、考试题目数 、分数线

第 行有 个正整数:分别为第 题至第 题的分值,,;

接下来 N 行,每行给出一名学生的学号(长度为 的字符串,学号的第一个字符可能为 )、该学生解出的题目总数 、以及这 道题的题号(题号由 到 )。

输出格式
对于每个问题,输出一行问题的编号( 开始编号,格式:case #0: 等)

然后首先在一行中输出不低于分数线的学生人数,接下来每行按考试成绩从高到低输出上分数线的学生的学号与成绩,其间用 1 个空格分隔。若有多名学生成绩相同,则按他 (她) 们学号的升序输出。

样例
input
3
4 5 25
10 10 12 13 15
10091130015 3 5 1 3
10091130013 5 2 4 1 3 5
10091130012 2 1 2
10091130011 3 2 3 5
2 3 20
10 10 10
10101130012 0
10101130019 2 1 2
1 2 40
10 30
10101130018 1 2
output
case #0:
3
10091130013 60
10091130011 37
10091130015 37
case #1:
1
10101130019 20
case #2:
0

思路

比较繁琐的一道题,输入,控制限制条件,统计学生分数,排序,再按照高于分数线的学生数目输出。

代码

  public static class Stu {

    public String id;
    public int sco;

    public Stu(String id, int sco) {
      this.id = id;
      this.sco = sco;
    }
  }

  public static void fun() {
    Scanner sc = new Scanner(System.in);
    int t = sc.nextInt();
    for (int temp = 0; temp < t; temp++) {
      int n = sc.nextInt();
      int m = sc.nextInt();
      int g = sc.nextInt();
      int count = 0;
      int[] a = new int[m];
      for (int i = 0; i < m; i++) {
        a[i] = sc.nextInt();
      }
      Stu[] s = new Stu[n];
      for (int i = 0; i < n; i++) {
        int sum = 0;
        String id = sc.next();
        int timu = sc.nextInt();
        for (int j = 0; j < timu; j++) {
          int tt = sc.nextInt();
          sum += a[tt - 1];
        }
        if (sum >= g) {
          count++;
        }
        s[i] = new Stu(id, sum);
      }
      Arrays.sort(s, new Comparator<Stu>() {
        @Override
        public int compare(Stu o1, Stu o2) {
          if (o1.sco != o2.sco) {
            return o2.sco - o1.sco;
          } else {
            StringBuffer sb1 =new StringBuffer(o1.id);
            StringBuffer sb2 =new StringBuffer(o2.id);
            for(int i=0;i<sb1.length();i++)
            {
              if(sb1.charAt(i)!=sb2.charAt(i)){
                return sb1.charAt(i)-sb2.charAt(i);
              }
            }
            return 1;
          }
        }
      });
      System.out.println("case #" + temp + ":");
      System.out.println(count);
      for (int i = 0; i < count; i++) {
        System.out.println(s[i].id + " " + s[i].sco);
      }
    }
  }

上一篇:YBTOJ:划分数列


下一篇:理解 MySQL 中的 JOIN 与 UNION