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