Description
有一天,N名社员参加了基础知识测试,现在测试名单上有每名社员的信息:姓名(纯英文字符串,且长度<=1000)、c语言、数据结构、英语成绩(0<=成绩<=150)。而三门科目的权重分别为50%,30%,20%,求加权后总分最高的学生,请按加权后的数据从大到小输出各项信息(姓名、各科成绩)。(如果总分相同,位置前的在前面)
Input
第一行输入一个正整数N(1<=N<=1000),表示社员个数。
第二行开始往下N行,对于每一行首先先输入一个字符串表示学生姓名,再输入三个自然数表示c语言、数据结构、英语成绩。均用空格相隔。
Output
排序后的名单
姓名 c语言 数据结构 英语
Sample Input
4
zyh 100 100 100
lxc 150 150 150
wyz 150 150 150
sda 99 80 30
Sample Output
lxc 150 150 150
wyz 150 150 150
zyh 100 100 100
sda 99 80 30
问题
- 用下面的代码通过了样例,但无法AC,为什么呢?
#include<bits/stdc++.h>
using namespace std;
typedef struct student{
string name;
double c;
double s;
double e;
double aver;
}ST;
bool cmp(ST a,ST b)
{
return a.aver>b.aver;
}
int main()
{
int n,i;
cin >> n;
ST a[n];
for(i=0;i<n;i++)
{
cin >> a[i].name >> a[i].c >> a[i].s >> a[i].e;
a[i].aver = 0.5*a[i].c + 0.3*a[i].s + 0.2*a[i].e;
}
sort(a,a+n,cmp);
for(i=0;i<n;i++)
{
cout << a[i].name << ' ' << a[i].c <<' ' << a[i].s << ' ' << a[i].e << endl;
}
}
—>因为sort排序是不稳定排序,当结构体没有位置信息时,2个同学总分相同,sort函数可能将它们交换也可能不将它们交换
总结
- 用sort是不稳定排序,用sort对结构体排序时,如果希望待比较数据(用于排序依据的数据)一样时,位置前的在前面,就需要在结构体中加入位置信息