NOIP2007 奖学金 结构体排序
是结构体排序的练习题,可供选手们巩固结构体排序的一些相关内容。
关于结构体排序
1.结构体定义
struct student { int num,a,b,c,sum; }p[310];
2.结构体初始化
for(int i=1;i<=n;i++) { scanf("%d%d%d",&p[i].a,&p[i].b,&p[i].c); p[i].num=i; p[i].sum=p[i].a+p[i].b+p[i].c; }
3.sort函数实现结构体排序
首先要知道sort函数在算法库里。 也就是
#include<algorithm>
具体使用方法如下,假如要给0-i的a数组按从小到大排序。
sort(a,a+i);
这里要注意,sort函数默认排序顺序是从小到大!! 但是有些同学(比如说我)喜欢空出0号位数组,从1开始读入,该咋排? 很简单:
sort(a+1,a+i+1);
4.cmp自定义函数
bool cmp(student a,student b) { /*code*/ }
bool cmp(student a,student b) { if(a.sum!=b.sum) return a.sum>b.sum; else if(a.a!=b.a) return a.a>b.a; else return a.num<b.num; }
好的,现在这道水题练习题就可以随随便便A掉了。 最后上AC代码:
#include<bits/stdc++.h> using namespace std; struct student { int num,a,b,c,sum; }p[310]; bool cmp(student a,student b) { if(a.sum!=b.sum) return a.sum>b.sum; else if(a.a!=b.a) return a.a>b.a; else return a.num<b.num; } int main() { int n; scanf("%d",&n); for(int i=1;i<=n;i++) { scanf("%d%d%d",&p[i].a,&p[i].b,&p[i].c); p[i].num=i; p[i].sum=p[i].a+p[i].b+p[i].c; } sort(p+1,p+n+1,cmp); for(int i=1;i<=5;i++) printf("%d %d\n",p[i].num,p[i].sum); return 0; }