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);
}
}
}