期末考试
Description
每个学期都会进行闻风丧胆的期末考试,每门功课所占权重不一样,假设成绩排序规则为:∑每门课程成绩*权值/课程总数。现在就请你写一个程序按照每个同学成绩最终生成总排名表(若最终成绩相同,则按照学号非降序排序)
Input
输入的第一行给出两个个正整数N(N≤1000)M(M≤20),依次代表学生总数、课程总数。第二行给出M个数,代表各个课程的权值,随后N行给出N个学生的各个课程成绩。格式为:考号(由13位整数字组成)和M个课程得分(为[0,100]区间内的整数),中间用空格分隔。
Output
输出汇总的排名表,每个考生的信息占一行,顺序为:考号、最终成绩。
Sample Input 1
4 2
0.1 0.9
1234567890001 95 100
1234567890005 100 98
1234567890003 95 96
1234567890002 77 88
Sample Output 1
1234567890001 99.5
1234567890005 98.2
1234567890003 95.9
1234567890002 86.9
代码能过样例,但是无法AC,望大家予以指导修改!
#include <stdio.h>
#include <stdlib.h>
typedef struct {long long id;double score;} rank;
int compare(const void* x,const void* y)
{
rank* m=(rank*)x;
rank* n=(rank*)y;
if(m->score != n->score)
return (m->score < n->score?1:-1);
return (m->id > n->id?1:-1);
}
int main()
{
int N,M,i,j,temp;
double w[20];
rank stu[1000];
scanf("%d%d",&N,&M);
for(i=0;i<M;++i)
scanf("%lf",&w[i]);
for(i=0;i<N;++i)
{
scanf("%lld",&stu[i].id);
for(j=0,stu[i].score=0.0;j<M;++j)
{
scanf("%d",&temp);
stu[i].score += (double)temp*w[j];//与题设中公式不一致,可能有误
}
}
qsort(stu,N,sizeof(stu[0]),compare);
for(i=0;i<N;++i)
printf("%s%lld %.1f",i?"\n":"",stu[i].id,stu[i].score);//可能有误,保留位数可能与权重的位数有关,但是如何实现成绩保留相应位数?
return 0;
}