批改多选题是比较麻烦的事情,有很多不同的计分方法。有一种最常见的计分方法是:如果考生选择了部分正确选项,并且没有选择任何错误选项,则得到 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 }
JAVA版

相关文章:

  • 2021-11-12
  • 2022-01-09
  • 2021-12-01
  • 2022-12-23
  • 2022-12-23
  • 2021-07-16
  • 2021-11-25
  • 2022-02-13
猜你喜欢
  • 2021-12-18
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2021-09-27
  • 2021-04-19
  • 2021-04-08
相关资源
相似解决方案