对于在中国大学MOOC(http://www.icourse163.org/ )学习“数据结构”课程的学生,想要获得一张合格证书,总评成绩必须达到 60 分及以上,并且有另加福利:总评分在 [G, 100] 区间内者,可以得到 50 元 PAT 代金券;在 [60, G) 区间内者,可以得到 20 元PAT代金券。全国考点通用,一年有效。同时任课老师还会把总评成绩前 K 名的学生列入课程“名人堂”。本题就请你编写程序,帮助老师列出名人堂的学生,并统计一共发出了面值多少元的 PAT 代金券。
输入格式:
输入在第一行给出 3 个整数,分别是 N(不超过 10 000 的正整数,为学生总数)、G(在 (60,100) 区间内的整数,为题面中描述的代金券等级分界线)、K(不超过 100 且不超过 N 的正整数,为进入名人堂的最低名次)。接下来 N 行,每行给出一位学生的账号(长度不超过15位、不带空格的字符串)和总评成绩(区间 [0, 100] 内的整数),其间以空格分隔。题目保证没有重复的账号。
输出格式:
首先在一行中输出发出的 PAT 代金券的总面值。然后按总评成绩非升序输出进入名人堂的学生的名次、账号和成绩,其间以 1 个空格分隔。需要注意的是:成绩相同的学生享有并列的排名,排名并列时,按账号的字母序升序输出。
输入样例:
1 2 3 4 5 6 7 8 9 10 11
| 10 80 5 cy@zju.edu.cn 78 cy@pat-edu.com 87 1001@qq.com 65 uh-oh@163.com 96 test@126.com 39 anyone@qq.com 87 zoe@mit.edu 80 jack@ucla.edu 88 bob@cmu.edu 80 ken@163.com 70
|
输出样例:
1 2 3 4 5 6 7
| 360 1 uh-oh@163.com 96 2 jack@ucla.edu 88 3 anyone@qq.com 87 3 cy@pat-edu.com 87 5 bob@cmu.edu 80 5 zoe@mit.edu 80
|
思路
在结构体中记录每个学生的信息,按照题目要求模拟存入,需要注意在输出学生的名次时,将当前学生的分数与上一位同学的分数比较,相同就需要再把定义的与偏移量++,当前的名次数值不变,若不相同,则把当前学生的名次值更新为上一位名次+偏移量,并重置偏移量的值即可。
代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50
| #include <algorithm> #include <iostream> using namespace std; const int Max = 10010; typedef struct Node { string name; int score; int pos; } Student;
bool cmp(Student a, Student b) { if (a.score == b.score) return a.name < b.name; return a.score > b.score; } Student stu[Max]; int main() { int n, g, k, sc; int sum = 0; string s; scanf("%d %d %d", &n, &g, &k); for (int i = 0; i < n; i++) { cin >> s >> sc; if (sc >= 60 && sc < g) sum += 20; else if (sc >= g) sum += 50; stu[i].name = s; stu[i].score = sc; stu[i].pos = i; } cout << sum << endl; sort(stu, stu + n, cmp); int p = 1, m = 1, la = stu[0].score; stu[0].pos = 1; cout << stu[0].pos << " " << stu[0].name << " " << stu[0].score << endl; for (int i = 1; i < n; i++) { if (stu[i].score != la) { p += m; m = 1; } else m++; stu[i].pos = p; la = stu[i].score; if (p > k) break; else cout << stu[i].pos << " " << stu[i].name << " " << stu[i].score << endl; } return 0; }
|