题解 P1093 【奖学金】

· · 题解

结构体排序严重好评

众所周知,sort是一个特别好的东西,但当排序面对的对象是结构体时,sort就不能自动排了,还需要手写填一个comp函数。

comp函数框架:

bool comp(结构体名称 x,结构体名称 y)
{
    按照题目的要求进行比较,并返回true或false;
}

在这道题中,comp的框架完全可以这样写:

bool comp(xx x,xx y)
{
    if(x.zf!=y.zf)//如果两个变量的总分不相同
        return x.zf>y.zf;//直接比较,总分大的在前面
    else
        if(x.yw!=y.yw)//如果两个学生总分相同、语文分数不相同
            return x.yw>y.yw;//语文分数大的排在前面
        else
            return x.bh<y.bh;//如果总分相同、语文分数也相同,编号小的在前面
}

再加上一些头文件定义、输入输出、初始化什么的,这题就AC了!


#include <bits/stdc++.h>//万能头文件
using namespace std;
struct xx{//定义结构体“学生”类型
    int yw;//语文分数
    int ss;//数学分数
    int yy;//英语分数
    int zf;//总分
    int bh;//编号
}a[305];//可以直接定义,注意定义结构体是后括号后一定要加上分号
int n;
bool comp(xx x,xx y)
{
    if(x.zf!=y.zf)
        return x.zf>y.zf;
    else
        if(x.yw!=y.yw)
            return x.yw>y.yw;
        else
            return x.bh<y.bh;
}//comp结构体排序,上文已经解释过
int main()
{
    cin>>n;//输入
    for(int i=1;i<=n;i++)
    {
        cin>>a[i].yw>>a[i].ss>>a[i].yy;//输入第i位学生的语文、数学、英语
        a[i].bh=i;//存储学生的编号
        a[i].zf=a[i].yw+a[i].ss+a[i].yy;//定义总分
    }
    sort(a+1,a+n+1,comp);//排序
    for(int i=1;i<=5;i++)
        cout<<a[i].bh<<" "<<a[i].zf<<endl;//循环输出
    return 0;
}