T11 谁拿了奖学金?50分求调

题目描述

期中考考完了,总要排排名次。该校有个特殊的规定:前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个数:能获得奖学金的学生的考号(按名次由高到低排列),每两个数之间用一个空格格开

样例输入:

5 3 1 92 98 93 97 95

样例输出:

2 4 5

数据范围:

见题目

时间限制:

1000

空间限制:

65536

题目描述

期中考考完了,总要排排名次。该校有个特殊的规定:前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个数:能获得奖学金的学生的考号(按名次由高到低排列),每两个数之间用一个空格格开

样例输入:

5 3 1 92 98 93 97 95

样例输出:

2 4 5

数据范围:

见题目

时间限制:

1000

空间限制:

65536

#include<bits/stdc++.h>
using namespace std;
int n,m,k,fs[63],sum,sum2;
struct node{
int pj,fc,id;
}q[1005];
bool cmp(node a,node b){
  if(a.pj==b.pj){
    if(a.fc==b.fc){
      return a.id<b.id;
    }
    return a.fc<b.fc;
  }
  return a.pj>b.pj;
}
int main(){
  cin>>n>>k>>m;
  for(int i=1;i<=n;i++){
    q[i].id=i;
    for(int j=1;j<=m;j++){
      cin>>fs[j];
      sum+=fs[j];
      sum2+=fs[j]*fs[j];
      }
      q[i].pj=sum/m;
      q[i].fc=(sum-m*q[i].pj*q[i].pj)/m;
      sum=0;
      sum2=0;
  }
  sort(q+1,q+n+1,cmp);
  for(int i=1;i<=k;i++){
    cout<<q[i].id<<" ";
  }
  return 0;
}

禁止发 AC 代码

1 个赞

重新发一遍不包括 AC 代码的思路

1 个赞