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

 import java.util.Scanner;
/**
* 原题目:https://www.patest.cn/contests/pat-b-practise/1069
* @author Xia
* 多选题目的计算方法
* 思维陷入了僵局:实际上完全没有必要用正则表达式一一解析字符串,只需要控制好读取即可
* 可以依次的读取,依次的获取需要的值
* 难点:正则表达式实现,括号的匹配
* 可惜有一个四分的点运行超时!!!
*/ public class basicalLevel1073MultipleChoiceCount { public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int n = in.nextInt(); //students numbers
int m = in.nextInt(); //test numbers
problem[] pArr = new problem[105]; //建立所有问题的数组
int[][] wrong = new int[101][5];
int max= -1; //记录错误最多的次数 for (int i = 0; i < m; i++) {
problem p = new problem();
p.score = in.nextInt();
p.optionNum = in.nextInt();
p.rightNum = in.nextInt();
p.rightAns = "";
for (int j = 0; j < p.rightNum; j++) {
p.rightAns += in.next();
}
pArr[i] = p;
} for (int i = 0; i < n; i++) {
double score = 0;
for (int j = 0; j < m; j++) { int flag = 1; //用于判断是否全对
String miss = in.next();
int k = miss.charAt(1)-'0';
String personAns = "";
for (int k2 = 0 ; k2 < k-1; k2++) {
personAns += in.next();
}
personAns += in.next().charAt(0);
if (personAns.equals(pArr[j].rightAns)) { //答案全部相同
score += pArr[j].score;
}else { //统计没有全对的情况
//错误情况
int l = 0;
for (l = 0; l < personAns.length(); l++) {
if (pArr[j].rightAns.contains(personAns.substring(l, l+1))==false) {
flag = 0;
wrong[j][personAns.charAt(l)-'a']++;
if (wrong[j][personAns.charAt(l)-'a']>max) {
max = wrong[j][personAns.charAt(l)-'a'];
}
}
}
//计算缺失的选项,也就是半对情况
int l2 = 0;
for (l2 = 0; l2 < pArr[j].rightAns.length(); l2++) {
if (personAns.contains(pArr[j].rightAns.substring(l2, l2+1))==false) {
wrong[j][pArr[j].rightAns.charAt(l2)-'a']++;
if (wrong[j][pArr[j].rightAns.charAt(l2)-'a']>max) {
max = wrong[j][pArr[j].rightAns.charAt(l2)-'a'];
}
}
} if (flag == 1) {
score += pArr[j].score/2.0;
}
}
}
System.out.printf("%.1f\n", score);
}
if (max == -1) {
System.out.println("Too simple");
}else {
for (int o = 0; o < m; o++) {
for (int o2 = 0; o2 < 5; o2++) {
if (wrong[o][o2]==max) {
System.out.printf("%d %d-%c\n", max,o+1,o2+'a');
}
}
}
}
}
} class problem{
int score;
int optionNum;
int rightNum;
String rightAns;
}

PAT——1073. 多选题常见计分法(20)的更多相关文章

  1. PAT 1073. 多选题常见计分法

    PAT 1073. 多选题常见计分法 批改多选题是比较麻烦的事情,有很多不同的计分方法.有一种最常见的计分方法是:如果考生选择了部分正确选项,并且没有选择任何错误选项,则得到50%分数:如果考生选择了 ...

  2. PAT 1073 多选题常见计分法(20)(代码+思路)

    1073 多选题常见计分法(20 分) 批改多选题是比较麻烦的事情,有很多不同的计分方法.有一种最常见的计分方法是:如果考生选择了部分正确选项,并且没有选择任何错误选项,则得到 50% 分数:如果考生 ...

  3. PAT 1073 多选题常见计分法 (20 分)

    批改多选题是比较麻烦的事情,有很多不同的计分方法.有一种最常见的计分方法是:如果考生选择了部分正确选项,并且没有选择任何错误选项,则得到 50% 分数:如果考生选择了任何一个错误的选项,则不能得分.本 ...

  4. 1073 多选题常见计分法 (20分)C语言

    批改多选题是比较麻烦的事情,有很多不同的计分方法.有一种最常见的计分方法是:如果考生选择了部分正确选项,并且没有选择任何错误选项,则得到 50% 分数:如果考生选择了任何一个错误的选项,则不能得分.本 ...

  5. PAT Basic 1073. 多选题常见计分法

    题目内容 多选题常见计分法(20) 时间限制 400 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 CHEN, Yue 批改多选题是比较麻烦的事情,有 ...

  6. P1073 多选题常见计分法

    P1073 多选题常见计分法 转跳点:

  7. 【PAT】B1073 多选题常见计分法(20 分)

    此处为我的存储结构,只提供一种思路,二维数组存储所有数据 #include<stdio.h> #include<string.h> #include<map> #i ...

  8. PAT 1024 科学计数法 (20)(精简版代码+思路+推荐测试样例)

    1024 科学计数法 (20)(20 分) 科学计数法是科学家用来表示很大或很小的数字的一种方便的方法,其满足正则表达式[+-][1-9]"."[0-9]+E[+-][0-9]+, ...

  9. PAT (Basic Level) Practise (中文)- 1024. 科学计数法 (20)

    PAT (Basic Level) Practise (中文)- 1024. 科学计数法 (20) http://www.patest.cn/contests/pat-b-practise/1024 ...

随机推荐

  1. ES6学习笔记(六)-数组扩展

  2. HTML标签类型

    标签分类: 一.块标签:块标签是指本身属性为display:block;的元素. 1.默认占一行可以设置宽高, 2.在不设置宽度的情况下,块级元素的宽度是它父级元素内容的宽度 3.在不设置高度的情况下 ...

  3. 从JSON中读取数据追加到HTML中

    本文来自https://www.jianshu.com/p/04127d74d88c,并非本人原创,只是作为自己学习使用的资料,如有浏览者请点击地址自行到原作者页面浏览 有时候我们需要将json数据直 ...

  4. csharp: read excel using Aspose.Cells

    /// <summary> /// /// </summary> /// <param name="strFileName"></para ...

  5. Linux ssh开启服务

    1.登陆linux系统,打开终端命令.输入 rpm -qa |grep ssh 查找当前系统是否已经安装 2.如果没有安装SSH软件包,可以通过yum  或rpm安装包进行安装 启动SSH服务2 安装 ...

  6. CSS绝对定位属性

    position - 类型:用于确定定位的类型,共有绝对(absolute).相对(relative)和静态(static)等3种选择. z-index - Z轴:用于控制网页中块元素的叠放顺序,可为 ...

  7. 微信小程序-scroll-view组件

    <view class="section"> <view class="section__title">vertical scroll& ...

  8. Word 关闭 Passive Voice

      Sheryl prefers passive voice for some of her writing (such as business documents and correspondenc ...

  9. Eclipse调试不能进入断点

    Eclipse下在给行设置断点或者在调试时弹出错误“Unable to install breakpoint due to missing line number attributes,Modify ...

  10. 购物车redis存储结构