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

