B-陈老师发奖金

B-陈老师发奖金

/ 0评 / 1366次 / 0

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

发表回复

您的电子邮箱地址不会被公开。

你好 No.63969