解题报告:
用二维数组储存每个学生每门课的成绩,用两个整型变量分别记录每个学生选了几门课与每门课有几个学生选。
再分别计算平均数,那么修正值i = 课程i平均 + 选了课程i的学生总体平均。
总之没有什么槽点,没有什么坑爹的地方……
下面是代码。
AC代码:
#include <iostream>
#include <string>
#include <memory.h>
using namespace std;
const int MAX_STU = 20;
const int MAX_SUB = 10;
int main()
{
int m, n;
int grade[MAX_STU][MAX_SUB];
int allaverage[MAX_SUB], subaverage[MAX_SUB];
int studentnum[MAX_SUB];
string subject[MAX_SUB];
memset(subaverage, 0, sizeof(subaverage));
memset(allaverage, 0, sizeof(allaverage));
memset(studentnum, 0, sizeof(studentnum));
cin >> m >> n;
for(int i = 0; i != n; ++i)
{
cin >> subject[i];
}
for(int i = 0; i != m; ++i)
{
for(int j = 0; j != n; ++j)
{
cin >> grade[i][j];
if(grade[i][j] != 0)
{
studentnum[j]++;
subaverage[j] += grade[i][j];
}
}
}
for(int i = 0; i != n; ++i)
{
subaverage[i] /= studentnum[i];
studentnum[i] = 0;
for(int j = 0; j != m; ++j)
{
if(grade[j][i] != 0)
{
for(int k = 0; k != n; ++k)
{
if(grade[j][k] != 0)
{
allaverage[i] += grade[j][k];
studentnum[i]++;
}
}
}
}
allaverage[i] /= studentnum[i];
}
for(int i = 0; i != n; ++i)
{
cout << subject[i] << " ";
cout << allaverage[i] - subaverage[i];
cout << endl;
}
return 0;
}
惯例,最后贴上原题。
http://poj.grids.cn/practice/4043/
4043:GPA排名系统
-
时间限制:
- 1000ms 内存限制:
- 65536kB
-
描述
-
目前,高等院校往往采用GPA来评价学生的学术表现。传统的排名方式是求对每一个学生的平均成绩,以平均成绩作为依据进行排名。
但这样的排名方法已经引起了教育界以及社会各界人士的争议,因为它存在着许多弊端。对于不同的课程,选课学生的平均成绩会不同程度地受到课程的难易程度和老师的严厉程度的制约。因而这样的排名系统无形中就鼓励了学生选择一些比较容易的课程,因为这样可以事半功倍地获得较高的平均分。
为了克服这些弊端,需要对排名系统做一定的改进。
一种改进的方案是对选第i门课的每一个学生的成绩加上一个特定的修正值di,例如编号为j的学生该课的成绩Gij修改为G'ij=Gij+di。最终使得经过调整后,该课调整后的平均分等于未调整前选该课的所有学生所有课的平均分。你的任务是根据某一个班级学生某学期的成绩,计算每门课的修正值di。
输入学生人数m(1 <= m <= 20)、课程数目n(1 <= n <= 10)、课程名称以及各个学生各门课的成绩。对于第i门课程,输出修正值di。
输入
-
1. 第一行输入两个整数,用空格分隔,分别为学生人数m和课程数目n。
2. 第二行输入n门课程名称,用空格分隔。每门课程的名称均不超过15个字符,均为小写。
3. 第三行开始输入m * n的矩阵。表示各个学生各门课成绩x(0 < x <= 100),以空格分隔。若学生未选此课,则该位输出0.
输出
- 输出为n行,每行格式为“math 5”。首先输出课程名称,空格后输出修正值di。di为整数(计算过程中小数部分均舍去,不考虑),若di为正输出‘’,否则输出‘-’
-
-