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

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

PS:

这道题跟1058有些相似,可以直接把代码搬过来改一下,这里我在结构体中增加了一个变量ncount[101](记录各题的错误次数),单独写了一个函数(比较正确选项与输入选项,同时更新ncount,返回该题得分),输出也一样,我们可以先找最大值,如果最大值存在,将与它相等的选项输出就行。

另:思路清晰啥都不是事T.T,硬是绕了一大圈,还是写个函数简单,哈哈。

#include<iostream>
#include<string>
#include<cmath>
using namespace std;
struct number {
double mark;
int nc;
int ny;
int ncount[101] = {0}; //用于记录每个选项错误次数
int pd[101] = { 0 }; }s[101];
double judge(int a[100], int b[100] ,int k) { //a为正确选项,b为输入选项
int count = 0; //正确计数器
int yn = 0; //0为答对,1为答错
for (int i = 0; i < s[k].nc; i++) {
if (b[i] && a[i]) { //如果输入为正确,正确计数器+1
count++;
}
else if (a[i] && !b[i]) { //没有输入的正确选项
s[k].ncount[i]++;
}
else if (!a[i] && b[i]) { //输入了一个错误的选项
s[k].ncount[i]++;
yn = 1;
}
}
if (yn)
return 0;
else if (count != s[k].ny) //部分正确
return s[k].mark / 2;
else if (count == s[k].ny) //全部正确
return s[k].mark; //返回得分
}
int main() {
int n, m, k;
double sum;
char ch;
int t[101]; //用t记录输入的选项
cin >> n >> m;
for (int i = 0; i < m; i++) {
cin >> s[i].mark >> s[i].nc >> s[i].ny;
for (int j = 0; j < s[i].ny; j++) {
cin >> ch;
s[i].pd[ch - 'a'] = 1;
}
}
for (int i = 0; i < n; i++) {
sum = 0;
for (int j = 0; j < m; j++) {
cin >> ch >> k;
for (int i = 0; i < 101; i++) t[i] = 0; //t置为空
for (int h = 0; h < k; h++) {
cin >> ch;
t[ch - 'a']++;
}
sum+=judge(s[j].pd, t,j);
cin >> ch;
}
printf("%0.1lf\n", sum);
}
int max = 0;
for (int i = 0; i < m; i++) { //寻找最大值
for (int j = 0; j < s[i].nc; j++)
max = s[i].ncount[j] > max ? s[i].ncount[j] : max;
}
if (max) { //存在最大值(即有错题)
for (int i = 0; i < m; i++) {
for (int j = 0; j < s[i].nc; j++)
if (s[i].ncount[j] == max) {
cout << max << " " << i + 1 << "-" << (char)(j + 'a') << endl;
}
}
}
else
cout << "Too simple";
return 0;
}

PAT 1073 多选题常见计分法(20)(代码+思路)的更多相关文章

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

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

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

    PAT 1073. 多选题常见计分法 批改多选题是比较麻烦的事情,有很多不同的计分方法.有一种最常见的计分方法是:如果考生选择了部分正确选项,并且没有选择任何错误选项,则得到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 1079 延迟的回文数(代码+思路)

    1079 延迟的回文数(20 分) 给定一个 k+1 位的正整数 N,写成 a​k​​⋯a​1​​a​0​​ 的形式,其中对所有 i 有 0≤a​i​​<10 且 a​k​​>0.N 被称 ...

  9. PAT 1081 检查密码(15) (代码+思路)

    1081 检查密码(15 分) 本题要求你帮助某网站的用户注册模块写一个密码合法性检查的小功能.该网站要求用户设置的密码必须由不少于6个字符组成,并且只能有英文字母.数字和小数点 .,还必须既有字母也 ...

随机推荐

  1. python2 与python3中最大的区别(编码问题bytes&str

    1,在python2.x 中是不区分bytes和str类型的,在python3中bytes和str中是区分开的,str的所有操作bytes都支持 python2 中 >>> s = ...

  2. Web 跨域请求

    在前端开发过程中,难免和服务端产生数据交互.一般情况我们的请求分为这么几种情况:   1. 只关注发送,不关注接收  2.不仅要发送,还要关注服务端返回的信息       a.  同域请求      ...

  3. Unable to open file '.RES'

    Unable to open file '.RES' 另存工程,带来的隐患,工程图标也改不了. 搜索发现源码里某个man.cpp里带了prgram  resource aaa.res,换成新工程文件名 ...

  4. Mysql 索引优化 - 2

    永远小表驱动大表(小数据驱动大数据) in exists区别, SELECT * FROM A WHERE A.id in (SELECT id FORM B) 若A表数据大于B表数据用in SELE ...

  5. Java Future 和 FutureTask 源码Demo

    Future 是一个接口,看源码有Future 和 FutreTask 使用Demo package java.util.concurrent; /** * A <tt>Future< ...

  6. hibernate-注解及配置

    联合主键: 一.将联合主键的字段单独放在一个类中,该类需要实现java.io.Serializable接口并重写equals和hascode,再将该类注解为@Embeddable,最后在主类中(该类不 ...

  7. 前端-HTML练习题

    本小节重点: 熟练使用div+span布局,知道div和span的语义化的意思 熟悉对div.ul.li.span.a.img.table.form.input标签有深刻的认知,初期也了解他们,知道他 ...

  8. kafka offset 设置

    from kafka import KafkaConsumer from kafka import TopicPartition from kafka.structs import OffsetAnd ...

  9. mysql改数据库名称

    第一种方法: 1.创建需要改成新名的数据库.2.mysqldum 导出要改名的数据库3.删除原来的旧库(确定是否真的需要)当然这种方法虽然安全,但是如果数据量大,会比较耗时,哎,当时连这种方法都没有想 ...

  10. jemalloc for mysql

    ptmalloc 是glibc的内存分配管理 tcmalloc 是google的内存分配管理模块 jemalloc 是BSD的提供的内存分配管理 三者jemalloc和tcmalloc的性能不分伯仲, ...