Description
陈老师拿到第一块金牌后,学校马上给了老师一笔奖金,老师很高兴,决定选择成绩优秀的同学颁发奖金,因为老师特别喜欢数学和c语言好的同学,所以在n位同学中: 优先选择数学和c语言成绩之和最高的4位同学颁发奖金; 若数学和c语言成绩之和相同,则给英语成绩高的同学,先颁发奖金; 若是数学和c语言成绩之和与英语成绩分别对应相同,优先给后读入的同学颁发奖金;
Input
多组输入。 共n+1行,第一行为学生总人数n; 接下来n行输入学生的信息,每一行为学生的学号,c语言成绩,英语成绩,数学成绩 (1<n<=1e5) 保证学号和成绩均在int范围内。
Output
按成绩从高到低输出,数学和c语言成绩之和最高的4位同学的学号以及对应的成绩。 (若总人数小于4,则直接输出,并且需要满足题目要求的排序后的同学学号)
Analysis
排序水题
Accepted Code
/* * @Author: Gehrychiang * @LastEditors: Gehrychiang * @Website: www.yilantingfeng.site * @E-mail: gehrychiang@aliyun.com */ #include <bits/stdc++.h> using namespace std; struct $ { int ser; int c; int eng; int math; int sum; int t; }; $ stu[100005]; bool comp($ a, $ b) { if (a.sum != b.sum) { return a.sum > b.sum; } else { if (a.eng != b.eng) { return a.eng > b.eng; } else { return a.t > b.t; } } } int main() { int n; while (cin >> n) { memset(stu, 0, sizeof(stu)); for (int i = 0; i < n; i++) { cin >> stu[i].ser >> stu[i].c >> stu[i].eng >> stu[i].math; stu[i].sum = stu[i].c + stu[i].math; stu[i].t = i; } sort(stu, stu + n, comp); if (n > 4) { for (int i = 0; i < 4; i++) { cout << stu[i].ser << " " << stu[i].sum << endl; } } else { for (int i = 0; i < n; i++) { cout << stu[i].ser << " " << stu[i].sum << endl; } } } return 0; }