B3798 [NICA #1] 梦熊培养计划

· · 题解

题目传送门

题意:

给定 n 个学生 m 次考试的情况,按成绩的波动情况(方差)从大到小输出姓名。

思路:

模拟即可,在输入时记录每个学生的成绩和,求出平均数,再根据 \sigma=\sqrt{\dfrac{\sum(X-\mu)^2}{N}} 求出方差,最后按从小到大排序,输出即可,注意数据类型。

代码:

#include<bits/stdc++.h>
using namespace std;
int n;
double m;
struct node{
    string s;
    double p,f,sum,a[25];
}e[100010];
bool cmp(node x,node y){
    if(x.f!=y.f){
        return x.f>y.f;
    }
    return x.s<y.s;
}
int main(){
    cin>>n>>m;
    for(int i=1;i<=n;++i){
        cin>>e[i].s;
        for(int j=1;j<=m;++j){
            cin>>e[i].a[j];
            e[i].sum+=e[i].a[j];
        }
        e[i].p=e[i].sum/m;
        for(int j=1;j<=m;++j){
            e[i].f+=(e[i].a[j]-e[i].p)*(e[i].a[j]-e[i].p);
        }
        e[i].f=e[i].f/m;
    }
    sort(e+1,e+n+1,cmp);
    for(int i=1;i<=min(n,20);++i){
        cout<<e[i].s<<'\n';
    }
    return 0;
}