#排序#结构体排序(sort函数)

P1093 [NOIP2007 普及组] 奖学金

题目链接:https://www.luogu.com.cn/problem/P1093

 

这题的学生和成绩的关系可以看出用结构体是十分方便的,但是在之前只使用sort函数对数组进行排序

如果使用sort函数对结构体进行排序,需要自己写出一个排序规则函数cmp

此题的排序规则

/1按总分从高到低排序
    //2如果两个同学总分相同,再按语文成绩从高到低排序
    //3如果两个同学总分和语文成绩都相同,那么规定学号小的同学 排在前面
 

则cmp函数如下

 1 bool cmp(stu a,stu b)//返回值为1的排序在前
 2 {
 3     if(a.sum>b.sum) return 1;
 4     else if(a.sum<b.sum) return 0;
 5     else//总分相同
 6     {
 7         if(a.c>b.c) return 1;
 8         else if(a.c<b.c) return 0;
 9         else//语文相同
10         {
11             if(a.num>b.num) return 0;
12             else return 1;
13         }
14     }
15 }
int main (){
    
    //先根据输入的3门课然后按上述规则排序,最后按排名顺序输出前五名名学生的学号和总分的成绩计算总分
    int n;
    cin>>n ;//获取学生人数
    //第一步先将所有学生三门成绩的总分计算出来然后存入结构体
for(int i=1;i<=n;i++)
    {
        student[i].num=i;//录入编号
        cin>>student[i].c>>student[i].m>>student[i].e;//输入
        student[i].sum=student[i].c+student[i].m+student[i].e;//计算总分
    }

    //1按总分从高到低排序
    //2如果两个同学总分相同,再按语文成绩从高到低排序
    //3如果两个同学总分和语文成绩都相同,那么规定学号小的同学 排在前面
     sort(student+1,student+1+n,cmp);//对所有同学的总分进行排序
    /*for(int i=n;i>=1;i--){
        cout<<i<<" "<<tot[i]<<endl; 
    }
    */
  for(int i=1;i<=5;i++)
        cout<<student[i].num<<' '<<student[i].sum<<endl;
    return 0;

 

posted @ 2021-04-28 15:54  krisoo  阅读(389)  评论(0)    收藏  举报