就是按照常规方法造一个结构体数组嵌套一个int数组来做,平台报的Aborted / IOT trap.
#include<cstdio>
#include<cstdlib>
#include<cmath>
#include<string>
#include<iostream>
#include<algorithm>
using namespace std;
struct student {
string name;
int score[21];
double average;
double variance;
};
int n, m;
student stulist[100002];
int cmp(const void* cp1, const void* cp2)
{
//比较方差
student* p1 = (student*)cp1;
student* p2 = (student*)cp2;
if (p1->variance > p2->variance) return -1;
//两个人方差的差值效果1e-5就视为相等
else if (fabs(p1->variance - p2->variance) < 1e-5) return p1->name < p2->name ? -1 : 1;
else return 1;
}
int main()
{
scanf("%d%d", &n, &m);
for (int i = 0; i <= n - 1; i += 1)
{
//输入姓名
cin >> stulist[i].name;
stulist[i].average = 0.0, stulist[i].variance = 0.0;
for (int j = 0; j <= m - 1; j += 1)
{
//一边输入分数一边计入平均分
scanf("%d", &stulist[i].score[j]);
stulist[i].average += 1. * stulist[i].score[j] / m;
}
//计算方差
for (int j = 0; j <= m - 1; j += 1) stulist[i].variance += 1. * pow(stulist[i].score[j] - stulist[i].average, 2.) / m;
}
//排序
qsort(stulist, n, sizeof(student), cmp);
for (int i = 0; i <= min(n, 20) - 1; i += 1) cout << stulist[i].name << endl;
}