桐桐的学校刚刚举行了期中考试,桐桐所在的七年级一共考了五个科目:语文、数学、英语、政治和历史。现在所有成绩都已经出来,班主任找到了桐桐,想让桐桐帮忙计算班里所有同学的五科总成绩,并按照总成绩由高到低的顺序排名,如果两个学生盼总成绩相同,则学号小的排在前面。你能够编写程序帮助桐桐完成任务吗?
第1行:一个数n(1≤n<100),表示桐桐所在班级的学生数;
第2行至第n+1行:第i行表示学号为i-1的学生的成绩(全部是整数,范围在O到1 00之间),每行有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
#include <iostream>
#include <bits/stdc++.h>
using namespace std;
struct stu
{
int num;
int c,m,e,p,h;
int sum;
};
int cmp(const void *a,const void *b)
{
stu*p1=(stu*)a;
stu*p2=(stu*)b;
return p1->sum<p2->sum;
}//快速排序
void Input(struct stu a[],int n)
{
int i;
for (i=0;i<n;i++)
{
scanf("%d%d%d%d%d",&a[i].c,&a[i].m,&a[i].e,&a[i].p,&a[i].h);
a[i].num=i+1;
}
}
void s(struct stu a[],int n)
{
int i,j;
struct stu b;
for (i=0;i<n;i++)
{
a[i].sum=a[i].c+a[i].m+a[i].e+a[i].p+a[i].h;
}
qsort(a,n,sizeof(stu),cmp);
for (i=0;i<n-1;i++)
{
for (j=0;j<n-1-i;j++)
{
if (a[j].sum==a[j+1].sum)
{
if (a[j].num>a[j+1].num)
{
b.num=a[j+1].num;
a[j+1].num=a[j].num;
a[j].num=b.num;
}
}
}
}
for (i=0;i<n;i++)
{
printf("%d ",a[i].num);
}
}
int main()
{
int n;
struct stu a[105];
scanf("%d",&n);
Input(a,n);
s(a,n);
return 0;
}
不知道为什么上图cmp有时候失效 故使用下图代码
int cmp(const void *a,const void *b)
{
return ((struct stu *)b)->sum-((struct stu *)a)->sum;
}