考试排名
题目描述桐桐的学校刚刚举行了期中考试,桐桐所在的七年级一共考了五个科目:语文、数学、英语、政治和历史。现在所有成绩都已经出来,班主任找到了桐桐,想让桐桐帮忙计算班里所有同学的五科总成绩,并按照总成绩由高到低的顺序排名,如果两个学生盼总成绩相同,则学号小的排在前面。你能够编写程序帮助桐桐完成任务吗?
输入第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;
}