批改多选题是比较麻烦的事情,有很多不同的计分方法。有一种最常见的计分方法是:如果考生选择了部分正确选项,并且没有选择任何错误选项,则得到 50% 分数;如果考生选择了任何一个错误的选项,则不能得分。本题就请你写个程序帮助老师批改多选题,并且指出哪道题的哪个选项错的人最多。
输入格式:
输入在第一行给出两个正整数 N(≤1000)和 M(≤100),分别是学生人数和多选题的个数。随后 M 行,每行顺次给出一道题的满分值(不超过 5 的正整数)、选项个数(不少于 2 且不超过 5 的正整数)、正确选项个数(不超过选项个数的正整数)、所有正确选项。注意每题的选项从小写英文字母 a 开始顺次排列。各项间以 1 个空格分隔。最后 N 行,每行给出一个学生的答题情况,其每题答案格式为 (选中的选项个数 选项1 ……),按题目顺序给出。注意:题目保证学生的答题情况是合法的,即不存在选中的选项数超过实际选项数的情况。
输出格式:
按照输入的顺序给出每个学生的得分,每个分数占一行,输出小数点后 1 位。最后输出错得最多的题目选项的信息,格式为:错误次数 题目编号(题目按照输入的顺序从1开始编号)-选项号。如果有并列,则每行一个选项,按题目编号递增顺序输出;再并列则按选项号递增顺序输出。行首尾不得有多余空格。如果所有题目都没有人错,则在最后一行输出 Too simple。
输入样例 1:
3 4
3 4 2 a c
2 5 1 b
5 3 2 b c
1 5 4 a b d e
(2 a c) (3 b d e) (2 a c) (3 a b e)
(2 a c) (1 b) (2 a b) (4 a b d e)
(2 b d) (1 e) (1 c) (4 a b c d)
输出样例 1:
3.5
6.0
2.5
2 2-e
2 3-a
2 3-b
输入样例 2:
2 2
3 4 2 a c
2 5 1 b
(2 a c) (1 b)
(2 a c) (1 b)
输出样例 2:
5.0 5.0 Too simple
这个题写了好长时间,先是用java写的,写了之后最后一个测试点运行超时。试着改成set集合,想着能快点,但还是不行。最后同样的思路换成了C语言通过了。
1 import java.util.Arrays; 2 import java.util.Scanner; 3 4 public class Hello { 5 static int N,M;//学生个数,选项数 6 public static void main(String[] args) { 7 Scanner sc = new Scanner(System.in); 8 N = sc.nextInt(); 9 M = sc.nextInt(); 10 Q[] q = new Q[M]; 11 Stu[] stu = new Stu[N]; 12 String temp;//临时变量 13 char[] temp1;//临时变量 14 char[] temp2;//临时变量 15 for(int i=0;i<M;i++) { 16 q[i] = new Q(); 17 q[i].a = sc.nextInt(); 18 q[i].b = sc.nextInt(); 19 q[i].c = sc.nextInt(); 20 q[i].e = new int[q[i].b];//选项初始化 21 temp = sc.nextLine(); 22 temp1 = temp.toCharArray(); 23 int k = 0; 24 //将正确选项存入问题类中的d属性中。 25 for(int j=0;j<temp1.length;j++) { 26 if(temp1[j]!= ' ') 27 q[i].d[k++] = temp1[j]; 28 } 29 } 30 //学生答案的输入。最终将学生答题情况存入学生类的a属性中。 31 for(int i=0;i<N;i++) { 32 temp = sc.nextLine(); 33 stu[i] = new Stu(); 34 temp1 = temp.toCharArray(); 35 temp2 = new char[temp1.length]; 36 int k = 0; 37 for(int j=0;j<temp1.length;j++) { 38 if(temp1[j]!=' '&&temp1[j]!='('&&temp1[j]!=')') { 39 temp2[k++] = temp1[j]; 40 } 41 } 42 int k1 = -1; 43 int k2 = 0; 44 for(int j=0;j<k;j++) { 45 if(temp2[j]<='g'&&temp2[j]>='a') { 46 stu[i].a[k1].d[k2++] = temp2[j]; 47 }else { 48 k1++; 49 stu[i].a[k1] = new Q(); 50 stu[i].a[k1].c = temp2[j]-'0'; 51 k2 = 0; 52 } 53 } 54 55 } 56 for(int i=0;i<N;i++) { 57 for(int j=0;j<M;j++) { 58 //如果学生答案个数比正确答案少 59 if(stu[i].a[j].c<=q[j].c) { 60 int flag = 0;//是否全部答对 61 char[] temp3 = q[j].d.clone(); 62 63 for(int k=0;k<stu[i].a[j].c;k++) { 64 int k1 = 0; 65 //检查学生某个答案是在正确答案中 66 for(k1=0;k1<q[j].c;k1++) { 67 //如果在则跳出,并标记此答案没有答错 68 if(q[j].d[k1]==stu[i].a[j].d[k]) { 69 temp3[k1] = 'q'; 70 break; 71 72 } 73 } 74 //如果不在,则说明学生此答案答错 75 if(k1==q[j].c) { 76 q[j].e[stu[i].a[j].d[k]-'a']++; 77 flag = 1;//不得分 78 } 79 80 } 81 //部分正确答案学生没有答出标记此答案也错了 82 for(int k=0;k<q[j].c;k++) { 83 if(temp3[k]!='q') { 84 q[j].e[temp3[k]-'a']++; 85 } 86 } 87 //如果没有答错 88 if(flag==0) { 89 //如果学生选项个数跟正确答案个数相同则满分 90 if(stu[i].a[j].c==q[j].c) 91 stu[i].mark += q[j].a; 92 //如果知只是部分答对 93 else 94 stu[i].mark += (double)q[j].a/2; 95 } 96 } 97 //处理学生答案比正确答案长的情况,处理相同,只是不得分。 98 else { 99 char[] temp3 = q[j].d.clone(); 100 for(int k=0;k<stu[i].a[j].c;k++) { 101 int k1 = 0; 102 for(k1=0;k1<q[j].c;k1++) { 103 if(q[j].d[k1]==stu[i].a[j].d[k]) { 104 temp3[k1] = 'q'; 105 break; 106 107 } 108 } 109 if(k1==q[j].c) { 110 q[j].e[stu[i].a[j].d[k]-'a']++; 111 } 112 113 } 114 for(int k=0;k<q[j].c;k++) { 115 if(temp3[k]!='q') { 116 q[j].e[temp3[k]-'a']++; 117 } 118 } 119 } 120 } 121 } 122 //输出分数。 123 for(int i=0;i<N;i++) { 124 System.out.println(stu[i].mark); 125 } 126 int max = 0; 127 //统计答案错的最多的次数 128 for(int i=0;i<M;i++) { 129 for(int j=0;j<q[i].b;j++) { 130 if(q[i].e[j]>max) 131 max = q[i].e[j]; 132 } 133 } 134 //没有答错 135 if(max==0) { 136 System.out.println("Too simple"); 137 }else { 138 //找出错的最多的选项与答案并输出。 139 for(int i=0;i<M;i++) { 140 for(int j=0;j<q[i].b;j++) { 141 if(q[i].e[j]==max) { 142 System.out.println(max+" "+(i+1)+"-"+(char) (j+'a')); 143 } 144 145 } 146 } 147 } 148 } 149 public static class Stu{ 150 Q[] a = new Q[M];//学生答案 151 double mark = 0;//学生分数 152 } 153 154 public static class Q{//问题类 155 int a;//满分 156 int b;//选项个数 157 int c;//正确选项数 158 char[] d = new char[5];//正确选项 159 int[] e;//选项错误次数 160 } 161 162 }