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

 

 

posted @ 2019-07-10 10:17  Seaway-Fu  阅读(343)  评论(0编辑  收藏  举报