原题:
Problem Description
今天的上机考试虽然有实时的Ranklist,但上面的排名只是根据完成的题数排序,没有考虑
每题的分值,所以并不是最后的排名。给定录取分数线,请你写程序找出最后通过分数线的
考生,并将他们的成绩按降序打印。
每题的分值,所以并不是最后的排名。给定录取分数线,请你写程序找出最后通过分数线的
考生,并将他们的成绩按降序打印。
Input
测试输入包含若干场考试的信息。每场考试信息的第1行给出考生人数N ( 0 < N
< 1000 )、考题数M ( 0 < M < = 10 )、分数线(正整数)G;第2行排序给出第1题至第M题的正整数分值;以下N行,每行给出一
名考生的准考证号(长度不超过20的字符串)、该生解决的题目总数m、以及这m道题的题号
(题目号由1到M)。
当读入的考生人数为0时,输入结束,该场考试不予处理。
< 1000 )、考题数M ( 0 < M < = 10 )、分数线(正整数)G;第2行排序给出第1题至第M题的正整数分值;以下N行,每行给出一
名考生的准考证号(长度不超过20的字符串)、该生解决的题目总数m、以及这m道题的题号
(题目号由1到M)。
当读入的考生人数为0时,输入结束,该场考试不予处理。
Output
对每场考试,首先在第1行输出不低于分数线的考生人数n,随后n行按分数从高
到低输出上线考生的考号与分数,其间用1空格分隔。若有多名考生分数相同,则按他们考
号的升序输出。
到低输出上线考生的考号与分数,其间用1空格分隔。若有多名考生分数相同,则按他们考
号的升序输出。
Sample Input
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
Sample Output
3 CS003 60 CS001 37 CS004 37 0 1 CS000000000000000002 20HintHuge input, scanf is recommended.WA:/********************************* 时间:2016-03-29 10:07:53 目的;杭电ACM Steps session3 ********************************/ #include <stdio.h> #include <string.h> int student_amount = 1; //考生人数,初值不为0 int k; //存储学号的长度 int lower_bound; //分数线 int count;//通过分数线的人数 /** 分数求和函数 **/ int sumfun(int score[], int num[], int num_length) { int m; //循环指标 int num_buffer; //题号缓冲区 int sumup = 0; //分数求和 for(m=0; m < num_length; m++) { num_buffer = num[m] - 1; //将题号对应的分数数组中的下标赋给题号缓冲区 sumup += score[num_buffer]; //累加对应分数 } return sumup; } /** 输出结果函数 **/ void output(char stNumber_[][20], int sum_[],int stNumber_length_2) { int temp1; //存储分数最大值的中间变量 char temp2[20]; //存储分数相同时学号较小字符数组的变量 int i,j,m; //循环指标 //分数排序 for(j=0; j < student_amount; j++) { for(i=0; i < student_amount-j-1; i++) { if(sum_[i] < sum_[i+1]) { temp1 = sum_[i]; sum_[i] = sum_[i+1]; sum_[i+1] = temp1; for(m=0; m < k; m++) { temp2[m] = stNumber_[i][m]; stNumber_[i][m] = stNumber_[i+1][m]; stNumber_[i+1][m] = temp2[m]; } } } } //分数相同时学号升序排序 for(i=0; i < student_amount-1; i++) { if(sum_[i] == sum_[i+1]) { for(m=0; m < k; m++) { temp2[m] = stNumber_[i+1][m]; stNumber_[i+1][m] = stNumber_[i][m]; stNumber_[i][m] = temp2[m]; } } } //统计通过分数线的人数 if(count != 0) {count = 0;} //初始化count for(i=0; i < student_amount; i++) { if(sum_[i] >= lower_bound) {count++;} } //输出本场考试结果 printf("%d\n", count); for(i = 0; i < student_amount; i++) { if(sum_[i] >= lower_bound) { for(j=0; j < k; j++) { printf("%c", stNumber_[i][j]); } printf(" %d\n", sum_[i]); } } } int main() { //while块每执行一次代表一次考试 while(1) { scanf("%d", &student_amount); if(student_amount == 0) {break;} char buffer1; //字符缓冲区 int problem_amount; //题目数量 int pass_num; int o; scanf(" %d %d", &problem_amount, &lower_bound); int i,j; //循环指标 //题目分数数组 int problem_score[10]; //获取各题目分数 char stNumber[1000][20];//储存所有考号 int sum[1000]; //储存本场老师每个学生分数的成绩数组 memset(stNumber, 0, sizeof(stNumber)); //手动初始化数组 for(i = 0; i < problem_amount; i++) { scanf("%d%c", &problem_score[i], &buffer1); } for(j=0; j < student_amount; j++ ) { char buffer = '\0'; //字符缓冲区 char str[20] ; //学号数组 memset(str,0,20); //手动初始化数组 int solve_amount = 0; //一个学生解决的题目数量 k=0; //获取学号数据 for(i=0; i<20; i++) { scanf("%c", &buffer); if(buffer != 32) { str[i] = buffer; k = i+1; //获取该数组非空元素的个数 } else { break; } } //清除缓冲区 buffer = '\0'; //读入解决的题目数量 scanf("%d ", &solve_amount); //根据获得的题数来创建题目数组 int solve_num[10]; for(i=0; i < solve_amount; i++) { scanf("%d", &solve_num[i]); scanf("%c", &buffer); } //将该考生分数放入成绩数组内 sum[j] = sumfun(problem_score, solve_num, solve_amount); //将该考生考号放入本场考试的考号数组 for(i=0; i < k; i++){ stNumber[j][i] = str[i]; } if(j == student_amount-1) { output(stNumber, sum, k); } } } return 0; } /******************************** Program Example: 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 3 CS003 60 CS001 37 CS004 37 1 2 40 10 30 CS001 1 2 0 2 3 20 10 10 10 CS000000000000000001 0 CS000000000000000002 2 1 2 1 CS000000000000000002 20 0 Process returned 0 (0x0) execution time : 93.178 s Press any key to continue. ********************************/