期中考考完了,总要排排名次。该校有个特殊的规定:前m(m<=60)名学生有奖学金可以拿。面对那批堆积如山的试卷,王主任茫然无措,于是他来向懂NOIP的你来求救,希望你能帮助他。
注:
①该校的名次的排列方式为:先排平均分,若平均分相同,则计算方差,方差小的学生排在前面,若方差也相同,则按考号的先后排列(考号小的排前面)。
②平均分、方差的小数部分忽略(即整数部分相同就相等),不是四舍五入。
③方差公式为:方差s=(x[1]*x[1]+x[2]x[2]+…+x[n]x[n]-nbb)/n (其中s为方差,x[1…n]为一组数,b为这组数的平均数)
输入格式:
第一行三个数n(n<=1000),m(m<=60),k(k<=10),其中n代表学生数,m表示能获得奖学金的学生人数,k代表期中考的课数。
接下来n行,每行k个数,第i行,第j行表示考号为i的学生第j门课的成绩x(x<=100)
输出格式:
仅有m个数:能获得奖学金的学生的考号(按名次由高到低排列),每两个数之间用一个空格格开
#include<bits/stdc++.h>
using namespace std;
int n,m,k;
struct bg{
int f[11],h,pf,fc;
}a[1001];
bool cmp(bg x,bg y){
if(x.pf==y.pf){
return x.fc<y.fc;
}
return x.pf>y.pf;
}
int main(){
cin>>n>>m>>k;
for(int i=1;i<=n;i++){
a[i].h=i;
for(int j=1;j<=k;j++){
cin>>a[i].f[j];
a[i].pf+=a[i].f[j];
a[i].fc+=a[i].f[j]*a[i].f[j];
}
a[i].pf/=k;
a[i].fc/=n;
}
stable_sort(a+1,a+n+1,cmp);
for(int i=1;i<=m;i++){
cout<<a[i].h<<" ";
}
}