Variance

来源:互联网 发布:linux shell脚本减法 编辑:程序博客网 时间:2024/06/05 08:18

实验任务

有一份成绩名单,每位学生有三门课程的分数,在正常情况下会按照总分从高到低排名。不过,我们想了解谁在各个课程中更加地稳定。请按照方差从低到高进行排序。若稳定度相同,在名单靠前的学生排前。

数据输入

第一行 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;    } 
0 0
原创粉丝点击