思路:
计算好每个人的分数后按题目要求排序即可。
解答:
#include <cstdio>
#include <algorithm>
#include <iostream>
#include <cstring>
using namespace std;
struct stu
{
char id[25];
int score = 0;
};
bool cmp(stu a, stu b) {
if(a.score == b.score)
return strcmp(a.id, b.id) < 0;
else
return a.score > b.score;
}
int main() {
int stu_num;
while(1) {
scanf("%d", &stu_num);
if(stu_num == 0)
break;
stu stu_arr[stu_num];
int q_num; // 问题数
int line; // 分数线
int count = 0; // 过线人数
scanf("%d %d", &q_num, &line);
int point[q_num]; // 每题分数
for(int i = 1; i <= q_num; i++) // 下标与题号一致,从1开始
scanf("%d", &point[i]);
for(int i = 0; i <= stu_num - 1; i++) {
int solved_num; // 解决的题目数
int solved_id; // 解决的题目的题号
scanf("%s %d", stu_arr[i].id, &solved_num);
for(int j = 0; j <= solved_num - 1; j++) {
scanf("%d", &solved_id);
stu_arr[i].score += point[solved_id]; // 当前学生的总成绩累加
}
if(stu_arr[i].score >= line) // 判断当前学生是否过线
count++;
}
sort(stu_arr, stu_arr + stu_num, cmp);
printf("%d\n", count);
for(int i = 0; i <= count - 1; i++) {
printf("%s %d\n", stu_arr[i].id, stu_arr[i].score);
}
}
return 0;
}
吐槽:
一直时间超限,又查又改半天没解决,突然发现测试时输入样例输入后输入也不会结束,才发现是跳出循环的条件写错了(ㄒoㄒ)