非常基础的排序

考试排名

题目描述桐桐的学校刚刚举行了期中考试,桐桐所在的七年级一共考了五个科目:语文、数学、英语、政治和历史。现在所有成绩都已经出来,班主任找到了桐桐,想让桐桐帮忙计算班里所有同学的五科总成绩,并按照总成绩由高到低的顺序排名,如果两个学生盼总成绩相同,则学号小的排在前面。你能够编写程序帮助桐桐完成任务吗?
输入第1行:一个数n(1≤n<100),表示桐桐所在班级的学生数;
第2行至第n+1行:第i行表示学号为i-1的学生的成绩(全部是整数,范围在O到100之间),每行有5个数,分别表示当前学生的五科成绩,相邻数之间用一个空格隔开。
输出只有1行,按总成绩由高到低的顺序输出对应学生的学号,相邻学号间用一个空格隔开。末尾也有空格
样例输入:
5
89 76 80 67 90
70 80 78 95 92
65 77 88 98 100
82 68 99 87 69
100 92 87 79 90
样例输出:
5 3 2 4 1
题目本来提示是插入排序的,但我觉得结构体完全能解决,然后暴力排序了一下(100的数据冒泡排序不会超时,数据再大些就要用sort函数了),发现能AC。

#include <bits/stdc++.h>
using namespace std;
typedef struct
{
    int a,z,x,c,p,b,sum;//学号,五科成绩,总成绩
}STU;
int main()
{
    int n,i,j;
    STU v[101],m;//定义中间结构体,用于冒泡排序的互换
    scanf("%d",&n);
    for(i=1;i<=n;i++)
    {
        scanf("%d%d%d%d%d",&v[i].z,&v[i].x,&v[i].c,&v[i].p,&v[i].b);
        v[i].a=i;
        v[i].sum=v[i].z+v[i].x+v[i].c+v[i].p+v[i].b;
    }
    for(i=1;i<n;i++)
    {
        for(j=1;j<n;j++)
        {
            if(v[j].sum<v[j+1].sum)//总成绩高的在前面
            {
                m=v[j];
                v[j]=v[j+1];
                v[j+1]=m;
            }
            if(v[j].sum==v[j+1].sum)//总成绩一样,学号小的在前面
            {
                if(v[j].a>v[j+1].a)
                {
                    m=v[j];
                    v[j]=v[j+1];
                    v[j+1]=m;
                }
            }
        }
    }
    for(i=1;i<=n;i++)
    {
        if(i==1) printf("%d",v[i].a);//第一个输出的数字前面没有空格,其余的有
        else printf(" %d",v[i].a);
    }
    printf("\n");
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值