不明白哪里错了呀!!!(抓狂)(已解决)

7. 谁拿了奖学金?

题目ID:1613必做题100分

最新提交:

Wrong Answer

60 分

历史最高:

Wrong Answer

60 分

时间限制: 1000ms

空间限制: 65536kB

题目描述

期中考考完了,总要排排名次。该校有个特殊的规定:前m(m<=60)名学生有奖学金可以拿。面对那批堆积如山的试卷,王主任茫然无措,于是他来向懂NOIP的你来求救,希望你能帮助他。
注:

①该校的名次的排列方式为:先排平均分,若平均分相同,则计算方差,方差小的学生排在前面,若方差也相同,则按考号的先后排列(考号小的排前面)。

②平均分、方差的小数部分忽略(即整数部分相同就相等),不是四舍五入。
③方差公式为:方差 s=(x[1]*x[1]+x[2]*x[2]+…+x[n]*x[n]-n*b*b)/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

\color{red}WA60分 救救我

#include <bits/stdc++.h>

using namespace std;

int n,m,k;

struct node{
	int id,op[15] = {},pjf,s;
}arr[1005]; 

bool cmp (node a,node b) {
	if(a.pjf == b.pjf) {
		if(a.s == b.s) {
			return a.id < b.id;
		}else {
			return a.s < b.s;
		}
	}else{
		return a.pjf > b.pjf;
	}
}

int main(int argv,char * argc[])
{
	cin >> n >> m >> k;
	for(int i = 1;i <= n;i++) {
		arr[i].id = i;
		for(int j = 1;j <= k;j++) {
			cin >> arr[i].op[j];
		}
	}
	for(int i = 1;i <= n;i++) {
		for(int j = 1;j <= k;j++) {
			arr[i].s += arr[i].op[j] * arr[i].op[j];
			arr[i].pjf += arr[i].op[j];
		}
		arr[i].pjf /= k;
		arr[i].s = (arr[i].s - n * arr[i].pjf * arr[i].pjf) / n;
	}
	
	stable_sort(arr + 1,arr + 1 + n,cmp);
	for(int i = 1;i <= m;i++) {
		cout << arr[i].id << ' ';
	}
	return 0;
}

int会爆

你是说用长整型吗,也是60分

刚才算了一下,int也是不会爆的

这里是 arr[i].s = (arr[i].s - k * arr[i].pjf * arr[i].pjf) / k;

OK解决了