奖学金(NOIP2007普及组复赛)c++思路及源代码

奖学金(NOIP2007普及组复赛)c++思路及源代码

先看题目:
某小学最近得到了一笔赞助,打算拿出其中一部分为学习成绩优秀的前5名学生发奖学金。期末,每个学生都有语文、数学、英语3门课的成绩。先按总分从高到低排序,如果两个同学总分相同,再按语文成绩从高到低排序,如果两个同学总分和语文成绩都相同,那么规定学号小的同学排在前面,这样,每个学生的排序是唯一确定的。
先根据输入的3门课的成绩计算总分,然后按上述规则排序,最后按排序顺序输出前5名学生的学号和总分。注意,在前5名同学中,每个人的奖学金都不相同,因此你必须严格按上述规则排序。例如,在某个正确答案中,如果前两行的输出数据(每行输出学号、总分两个数)是:

7 279 


5 279 

这两行数据的含义是:总分最高的两个同学的学号依次是7号、5号。这两名同学的总分都是279(总分等于输入的语文、数学、英语三科成绩之和),但学号为7的学生语文成绩更高一些
输入
第一行为一个正整数n,表示该校参加评选的学生人数。

第2n+1行,每行有三个数字,每个数字都在0100之间。第j行的三个数字依次表示学生为j-1的学生的语文、数学、英语的成绩。每个学生的学号按照输入顺序编号为1~n(恰好是输入数据的行号减一)。所给的数据都是正确的,不必检验
输出
共有5行,每行是两个用一个空格隔开的正整数,依次表示为5名学生的学号和总分
样例输入
10
78 44 40
91 91 83
98 51 54
61 88 33
77 46 83
76 93 67
66 68 61
76 35 69
68 79 36
90 90 84
样例输出
2 265
10 264
6 236
5 206
3 203
话不多说,直接看代码

#include
#include
using namespace std;
struct student{            //定义结构体student 包含语文,数学,英语三门成绩及学号,总分 
    int xuehao;
    int yu,shu,ying;
    int zong;
};
bool cmp(student x,student y)      //定义结构体排序函数cmp 
{
 if(x.zong==y.zong)
 {
  if(x.yu==y.yu)
  {
   return x.xuehaoy.yu;    //当总分相同时, 语文成绩高的排在前面 
 }
    return x.zong>y.zong;
}
int main()
{
    student a[1000];    //定义student类型变量数组a[1000] 
    int n;
    cin>>n;
    for(int i=1;i<=n;i++)
    {
        a[i].xuehao=i;
        cin>>a[i].yu>>a[i].shu>>a[i].ying;
        a[i].zong=a[i].yu+a[i].shu+a[i].ying;
    }
    sort(a+1,a+n+1,cmp);   //排序 
    for(int i=1;i<=5;i++)   //顺次输出 
        cout<

你可能感兴趣的:(编程思路及题解)