Problem D: 奖金发放

Problem D: 奖金发放

[Creator : ]
Time Limit : 1.000 sec  Memory Limit : 128 MiB

Description

某小学最近得到了一笔赞助,打算拿出其中一部分为学习成绩优秀的前  名学生发奖学金。期末,每个学生都有  门课的成绩:语文、数学、英语。先按总分从高到低排序,如果两个同学总分相同,再按语文成绩从高到低排序,如果两个同学总分和语文成绩都相同,那么规定学号小的同学排在前面,这样,每个学生的排序是唯一确定的。

任务:先根据输入的  门课的成绩计算总分,然后按上述规则排序,最后按排名顺序输出前五名名学生的学号和总分。

注意,在前  名同学中,每个人的奖学金都不相同,因此,你必须严格按上述规则排序。例如,在某个正确答案中,如果前两行的输出数据(每行输出两个数:学号、总分) 是:

7 279  
5 279

这两行数据的含义是:总分最高的两个同学的学号依次是  号、 号。这两名同学的总分都是  (总分等于输入的语文、数学、英语三科成绩之和) ,但学号为  的学生语文成绩更高一些。

如果你的前两名的输出数据是:


5 279  
7 279
则按输出错误处理,不能得分。





#include <bits/stdc++.h> 
using namespace std; 
int const MAXN = 310; 
int n; 

____________ { // 定义结构体 student
    ____________;  // 包括学号、语文、总分
}a[MAXN]; // 并定义结构体数组 a

int cmp(student a, student b) {
    if(a.total != b.total) // 如果 a 的总分不等于 b 的总分
        return a.total > b.total; // 返回 a 的总分大于 b 的总分
    if(___________)// 如果 a 的语文不等于 b 的语文
        ___________;// 返回 “a 的语文大于 b 的语文” 是否成立
    ___________;// 返回 “a 的学号小于 b 的学号” 是否成立
}
int main() {
    cin >> n; //读入 n
    for (   ;   ;   ) { // 循环,处理每一个同学
        int math, english;  // 临时变量数学和英语
        ___________;// 读入第 i 个同学的语文成绩,以及用临时变量读入数学和英语成绩。
        ___________;// 计算第 i 个同学的总分。
        ___________;// 记录第 i 个同学的学号。
    }
    
    _______________// 用 sort 排序,注意加上 cmp
    for (   ;   ;   ){ // 循环:输出前 5 名学生的信息
        // 输出学号和总分。
    }
    return 0;
}


Input

共  行。

第  行为一个正整数 ,表示该校参加评选的学生人数。

第  到  行,每行有  个用空格隔开的数字,每个数字都在  到  之间。第  行的  个数字依次表示学号为  的学生的语文、数学、英语的成绩。每个学生的学号按照输入顺序编号为 (恰好是输入数据的行号减 )。

保证所给的数据都是正确的,不必检验。

Output

共  行,每行是两个用空格隔开的正整数,依次表示前  名学生的学号和总分。

Sample Input Copy

6
90 67 80
87 66 91
78 89 91
88 99 77
67 89 64
78 89 98

Sample Output Copy

6 265
4 264
3 258
2 244
1 237