排名-含结构排名

题目描述

    今天的上机考试虽然有实时的Ranklist,但上面的排名只是根据完成的题数排序,没有考虑每题的分值,所以并不是最后的排名。给定录取分数线,请你写程序找出最后通过分数线的考生,并将他们的成绩按降序打印。

输入

    测试输入包含若干场考试的信息。每场考试信息的第1行给出考生人数N ( 0 < N < 1000 )、考题数M ( 0 < M < = 10 )、分数线(正整数)G;第2行排序给出第1题至第M题的正整数分值;以下N行,每行给出一名考生的准考证号(长度不超过20的字符串)、该生解决的题目总数m、以及这m道题的题号(题目号由1到M)。  
    当读入的考生人数为0时,输入结束,该场考试不予处理。

输出

    对每场考试,首先在第1行输出不低于分数线的考生人数n,随后n行按分数从高到低输出上线考生的考号与分数,其间用1空格分隔。若有多名考生分数相同,则按他们考号的升序输出

样例输入

4 5 25
10 10 12 13 15
CS004 3 5 1 3
CS003 5 2 4 1 3 5
CS002 2 1 2
CS001 3 2 3 5
1 2 40
10 30
CS001 1 2
2 3 20
10 10 10
CS000000000000000001 0
CS000000000000000002 2 1 2
0

样例输出

3
CS003 60
CS001 37
CS004 37
0
1
CS000000000000000002 20

 1 #include<stdio.h>
 2 #include<malloc.h>
 3 #include<algorithm>
 4 #include<string.h>
 5 using namespace std;
 6 
 7 typedef struct stu{
 8     char num_P[21];
 9     int tol_slv;
10     int flag_slv[12];
11     int getscore;
12 }stu;
13 bool cmp(stu s1,stu s2){
14     int t=strcmp(s1.num_P,s2.num_P);
15     if(s1.getscore==s2.getscore) return t<0;//return t<0就表示了方晖字符串比较的升序
16     else return s1.getscore>s2.getscore;
17 }
18 int main(){
19     int num_P;
20     while(scanf("%d",&num_P)&&num_P>0&&num_P<1000){
21         int num_Q,num_G;
22         int pass=0;//记录过线人数
23         scanf("%d %d",&num_Q,&num_G);
24         int *Q_ary=(int *)malloc(num_Q*sizeof(int));
25         for(int i=0;i<num_Q;i++){//读每道题分值
26             scanf("%d",&Q_ary[i+1]);//跟flag_slv[]对齐
27         }
28         stu *student=(stu *)malloc(sizeof(stu)*num_P);
29         for(int i=0;i<num_P;i++){//每个学生数据初始化
30             scanf("%s %d",student[i].num_P,&student[i].tol_slv);//学号和总的做出题数
31             for(int j=0;j<student[i].tol_slv;j++){
32                 int pos;
33                 scanf("%d",&pos);
34                 student[i].flag_slv[pos]=1;//编辑做出题的位置
35             }
36         }
37         for(int i=0;i<num_P;i++){//每个人遍历
38                student[i].getscore=0;//初始化
39             for(int j=0;j<num_Q;j++){ //每道题检查做出来没,分数累加
40                 if(student[i].flag_slv[j+1]){
41                     student[i].getscore+=Q_ary[j+1];
42                 }
43 
44             }
45             if(student[i].getscore>=num_G) pass++;
46 
47         }
48         if(pass==0) printf("0\n");
49         else {
50             printf("%d\n",pass);
51             sort(student,student+num_P,cmp);
52             for(int i=0;i<num_P;i++){
53                 if(student[i].getscore>=num_G){
54                     printf("%s %d\n",student[i].num_P,student[i].getscore);
55                 }
56             }
57 
58         }
59 
60 
61     }
62 return 0;
63 }

猜你喜欢

转载自www.cnblogs.com/debug-the-heart/p/12486957.html