【出分前夕】怎搞呢,难的题不会写,简单的题就算多花点时间也要写出来
#include <cstdio>
#include <algorithm>
#include <string>
#include <vector>
using namespace std;
struct Stu {
string id; // 学号
int grade; // 成绩
};
// 比较函数:先按成绩降序,成绩相同则按学号升序
bool cmp(const Stu &lhs, const Stu &rhs) {
if (lhs.grade == rhs.grade) {
return lhs.id < rhs.id;
}
return lhs.grade > rhs.grade;
}
// 4 5 25 4个人,5道考题,分数线是25
// 10 10 12 13 15 1~5题每题的分值
// CS004 3 5 1 3 学号 解决了3道题,分别是第5题,第1题和第3题
// CS003 5 2 4 1 3 5
// CS002 2 1 2
// CS001 3 2 3 5
int main() {
int N, M, G; // N位考生,M道题,分数线G
while (scanf("%d", &N) != EOF) {
if (N == 0) break; // 输入结束
scanf("%d%d", &M, &G);
vector<int> scores(M + 1); // 存储每道题的分值,从1开始编号
for (int i = 1; i <= M; i++) {
scanf("%d", &scores[i]);
}
vector<Stu> students; // 存储学生信息
for (int i = 0; i < N; i++) {
char id[30];
int solved;
scanf("%s%d", id, &solved);
int total = 0;
for (int j = 0; j < solved; j++) {
int problem;
scanf("%d", &problem);
total += scores[problem]; // 累加成绩
}
students.push_back({ id, total }); // 存储学生信息
}
// 按成绩降序排序,成绩相同则按学号升序
sort(students.begin(), students.end(), cmp);
// 统计通过分数线的人数
int cnt = 0;
for (const Stu &stu : students) {
if (stu.grade >= G) {
cnt++;
}
else {
break; // 后续学生成绩更低,无需继续检查
}
}
// 输出结果
printf("%d\n", cnt);
for (int i = 0; i < cnt; i++) {
printf("%s %d\n", students[i].id.c_str(), students[i].grade);
}
}
return 0;
}

京公网安备 11010502036488号