实验任务
有一份成绩名单,每位学生有三门课程的分数,在正常情况下会按照总分从高到低排名。不过,我们想了解谁在各个课程中更加地稳定。请按照方差从低到高进行排序。若稳定度相同,在名单靠前的学生排前。
数据输入
第一行 N,代表有几位学生。(N <= 10000)
接下来 N 行,每行为该同学的姓名和三门成绩分数。(0<=成绩<=100的整数)
(学生姓名长度不超过 10)
数据输出
输出有序的名单,每行为该学生的姓名。
输入示例
3
A 100 100 100
B 60 90 91
C 75 77 76
输出示例
A
C
B
解题思路
可能一开始会定义个double按照定义来算方差,但是会发现浮点数难免有精度上的误差,因此我们可以适当扩大一定比例,保证结果为整型。
参考代码
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <string>
#define sqr(x) ((x)*(x))
const int maxn = 10010;
using namespace std;
struct STU{
int g1,g2,g3,p;
string name;
int var;
}stu[maxn];
bool cmp(const STU& s1,const STU& s2){
return ((s1.var < s2.var) || (s1.var == s2.var && s1.p < s2.p));
}
int main()
{
int n,i;
while (cin >> n){
int aver;
for (i = 0;i < n;i++){
cin >> stu[i].name >> stu[i].g1 >> stu[i].g2 >> stu[i].g3;
stu[i].p = i;
aver = (stu[i].g1 + stu[i].g2 + stu[i].g3);
stu[i].var = (sqr(3*stu[i].g1-aver) + sqr(3*stu[i].g2-aver) + sqr(3*stu[i].g3-aver)); //等比例扩大
}
sort(stu,stu+n,cmp);
for (i = 0;i < n;i++)
cout << stu[i].name << endl;
}
return 0;
}