题目描述:目前,高等院校往往采用 GPA(Grade Point Average)来评价学生的学术表现。传 统的排名方式是求每一个学生的平均成绩,以平均成绩作为依据进行排名。 但是这样的排名方法已经引起了教育界以及社会各界人士的争议。因为它存在 着许多弊端。对于不同的课程,选课学生的平均成绩会不同程度地受到课程的难易 程度和老师的严厉程度的制约。因而这样的排名系统无形中就鼓励了学生选择一些 比较容易的课程,因为这样可以事半功倍地获得较高的平均分。
为了克服这些弊端,我们需要对排名系统做一定的改进。 一种改进的方案是对选第 i 门课的每一个学生的成绩加上一个特定的修正值 di, 例如编号为 j 的学生该课的成绩 Gij修改为 G’ij=Gij+di。最终使得经过调整后,该课的 平均分等于选该课的所有学生的所有课的平均分。对每一门课都做这样的调整,使 得上述条件对所有课程都满足。这种调整方案一定程度地避免了传统排名系统的不 公正。而你的任务正是根据一个大学某一个年级学生某学年的成绩,给出他们的排 名。假设每一个学生都至少选一门课。
输入描述:输入文件为 gpa.in。 输入文件第一行是两个正整数 m(1<=m<=500)和 n(1<=n<=100),分别表示学 生人数和课程数目。 接下来 m 行是一个矩阵,矩阵中第 i 行的第 j 个元素表示第 i 个学生第 j 门课的 成绩 G(i,j)。输入的成绩是一个 0 到 100 之间的整数,如果该学生没有选这门课,那 么 G(i,j)=-1。由于该方案的施行只是为了获得更加科学的排名,因此调整后的成绩 的数值大小本身没有什么意义,因此调整后的成绩可以不是 0-100 之间的数。
输出描述:输出文件为 gpa.out。 输出采用改进方案后这些学生的排名。以学生编号的形式输出,每行是一个学 生的编号。 如果在上述调整后,有若干学生平均分相等(精确到小数点后的三位),则他们的 名次相同,按照任意顺序输出。 当然许多时候,上述调整无法顺利进行,即调整的目标无法达到。(因此,在实 际问题中,我们往往在最小二乘意义下获得一种最接近目标的调整方案。)也有可能或者因调整不唯一而不能确定学生的名次。若以上两种情况发生,则输出“fail”。
首先根据题目我们另
gi 为原来科目
i 的平均值,令
di 为修正值,第
i 个学生的第
j 门科目的原来的成绩为
Gi,j ,第
i 位学生选择了
Ti 门科目,令同时选择
i,j 的人数为
Si,j,∑nj=1Si,j=Ki ,那么我们可以得到一个方程
∑mj=1,Gj,i≠−1Gj,iSi,i+di=∑mj=1,Gj,i≠−1∑nk=1,Gj,k≠−1Gj,k+dk∑mj=1Si,j
那么令
∑mj=1,Gj,i≠−1Gj,i 为
Pi
PiSi,i+di=∑mj=1,Gj,i≠−1∑nk=1,Gj,k≠−1Gj,k+dkKi
所以有
KiPiSi,i+Kidi=∑j=1nSi,jdj+∑k=1Gk,i≠−1m∑j=1Gk,j≠−1nGk,j
因为
∑mk=1,Gk,i≠−1∑nj=1,Gk,j≠−1Gk,j 是可以预处理的那么我们令它为
Ei 然后得到
KiPiSi,i+Kidi=∑j=1nSi,jdj+Ei
Kidi−∑j=1nSi,jdj=Ei−KiPiSi,i
∑j=1nSi,jdj−Kidi=KiPiSi,i−Ei
那么对于每一个不同的i都可以得到一个不同的方程通过高斯消元进行解决那么算法复杂度预计是
O(nm+n3) 这里n的值大概是100左右应该能够胜任本题目。
下面开始构造矩阵,那么可以得到:
⎡⎣⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢S1,1−K1S2,1⋮Sn,1S1,2S2,2−K2⋮Sn,2S1,3S2,3⋮Sn,3⋯⋯⋱⋯K1P1S1,1−E1K2P2S2,2−E2⋮KnPnSn,n−En⎤⎦⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥
然后高斯消元解个方程,带入排序就好了。。。
简直我说不出话来了
其实我是逗你的这个方程没有解233333,如果你看到这行字,那说明你成功的找到了正解,但是答案并不是fail因为找到的是不同课程之间的关系,来吧我的坑已暂时挖到这里,下面由你来帮我继续挖,挖完请给我留下回复 Thanks