P1058 选择题

转跳点:

1058 选择题 (20分)

批改多选题是比较麻烦的事情,本题就请你写个程序帮助老师批改多选题,并且指出哪道题错的人最多。

输入格式:

输入在第一行给出两个正整数 N(≤ 1000)和 M(≤ 100),分别是学生人数和多选题的个数。随后 M 行,每行顺次给出一道题的满分值(不超过 5 的正整数)、选项个数(不少于 2 且不超过 5 的正整数)、正确选项个数(不超过选项个数的正整数)、所有正确选项。注意每题的选项从小写英文字母 a 开始顺次排列。各项间以 1 个空格分隔。最后 N 行,每行给出一个学生的答题情况,其每题答案格式为 (选中的选项个数 选项1 ……),按题目顺序给出。注意:题目保证学生的答题情况是合法的,即不存在选中的选项数超过实际选项数的情况。

输出格式:

按照输入的顺序给出每个学生的得分,每个分数占一行。注意判题时只有选择全部正确才能得到该题的分数。最后一行输出错得最多的题目的错误次数和编号(题目按照输入的顺序从 1 开始编号)。如果有并列,则按编号递增顺序输出。数字间用空格分隔,行首尾不得有多余空格。如果所有题目都没有人错,则在最后一行输出 Too simple

输入样例:

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) (2 b d) (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) (2 b c) (4 a b c d)

输出样例:

3
6
5
2 2 3 4

这道题稍微复杂一些,但吧PAT乙里面的题只需要进行拆解,拆出来的每一部分都是很简单的。

这道题可以使用结构数组存储每一道题的分数、选项数、正确选项数、正确选项和学生答错数量。一千个coder就会有一千种存储方法,我存储方式上取了个巧(又飘了( ̄▽ ̄)”)

我没有对选项进个数和正确答案个数进行存储,我采用了位字段的方式对正确答案进行存储,因为答案选项最多只有5个,用整型的5个位的0 1存储刚好合适,例如 a b d e,那么这个量就是二进制00011011(从低向高存储)

代码实现如下:

int AnsRecord()
{
char ch;
int AnsQun, Ans = 0;
scanf("%d", &AnsQun);
for (int i = 0; i < AnsQun; i++)
{
while (' ' == (ch = getchar()))
;
Ans |= 1 << (ch - 'a');
}
return Ans;
}

这样直接比较整型的大小就知道答案是否一致,并且综合了选项数、正确选项数、正确选项三项信息,节约的空间,也节省了时间。(其实就是脑子抽了 ╰( ̄ω ̄o))

AC代码:

#include <stdio.h>
#include <stdlib.h> typedef struct QunData
{
int mark;
int wrong; //错误个数
int Ans; //位字段方式存储
} Qun; int AnsRecord(); int main(void)
{
int qunstionQun, studentQun, max = 0; scanf("%d %d", &studentQun, &qunstionQun); Qun Quntion[qunstionQun]; for (int i = 0; i < qunstionQun; i++)
{
scanf("%d %d", &Quntion[i].mark, &Quntion[i].wrong);
Quntion[i].wrong = 0;
Quntion[i].Ans = AnsRecord();
} for (int i = 0; i < studentQun; i++)
{
int score = 0;
for (int j = 0; j < qunstionQun; j++)
{
while (getchar() != '(')
;
if (Quntion[j].Ans == AnsRecord())
{
score += Quntion[j].mark;
}
else if (++Quntion[j].wrong > max)
{
max = Quntion[j].wrong;
}
while (getchar() != ')')
;
}
printf("%d\n", score);
} if (0 == max)
{
printf("Too simple");
}
else
{
printf("%d", max);
for (int i = 0; i < qunstionQun; i++)
{
if (Quntion[i].wrong == max)
{
printf(" %d", i + 1);
}
}
} return 0;
} //读入正确答案
int AnsRecord()
{
char ch;
int AnsQun, Ans = 0;
scanf("%d", &AnsQun);
for (int i = 0; i < AnsQun; i++)
{
while (' ' == (ch = getchar()))
;
Ans |= 1 << (ch - 'a');
}
return Ans;
}

PTA不易,诸君共勉!

P1058 选择题的更多相关文章

  1. Hibernate选择题总结

    Hibernate选择题总结 1.在Hibernate中,以下关于主键生成器说法错误的是( ). A.increment可以用于类型为long.short或byte的主键 B.identity用于如S ...

  2. 选择题(codevs 2919)

    2919 选择题  时间限制: 1 s  空间限制: 16000 KB  题目等级 : 黄金 Gold 题解  查看运行结果     题目描述 Description 某同学考试,在N*M的答题卡上写 ...

  3. Servlet、JSP选择题(2)

    Java EE软件工程师认证考试 试题库-选择题 一.    选择题(包括单选和双选) 1.B 编写一个Filter,需要(  ) A. 继承Filter 类 B. 实现Filter 接口 C. 继承 ...

  4. Servlet、JSP选择题

    Java EE软件工程师认证考试 试题库-选择题   一.    选择题(包括单选和双选) 1.A 对于B/S架构的工作流程,以下说法正确的是(   )(选择一项) A. 浏览器接受用户的输入--&g ...

  5. JavaScript、Jquery选择题

    尚学堂Java EE软件工程师认证考试 试题库-选择题     一.    选择题(包括单选和双选) 1.B 在JavaScript中,以下变量命名非法的是(   )(选择一项) A. numb_1 ...

  6. HTML、CSS选择题

    Java EE软件工程师认证考试 试题库-选择题   一.    选择题(包括单选和双选) 1.D 以下(    )是HTML常用的块状标签(选择一项) A. <span> B. < ...

  7. opencv 手写选择题阅卷 (二)字符识别

    opencv 手写选择题阅卷 (二)字符识别 选择题基本上只需要识别ABCD和空五个内容,理论上应该识别率比较高的,识别代码参考了网上搜索的代码,因为参考的网址比较多,现在也弄不清是参考何处的代码了, ...

  8. opencv 手写选择题阅卷 (四)Android端 手机应用开发

    opencv 手写选择题阅卷 (四)Android 手机应用开发 在PC端把代码调通以后开始开发Android 手机应用,因为主要功能代码为C++代码,所以需要通过NDK编译,JAVA通过JNI方式调 ...

  9. opencv 手写选择题阅卷 (三)训练分类器

    opencv 手写选择题阅卷 (三)训练分类器 1,分类器选择:SVM 本来一开始用的KNN分类器,但这个分类器目前没有实现保存训练数据的功能,所以选择了SVN分类器; 2,样本图像的预处理和特征提取 ...

随机推荐

  1. 洛谷P2142 高精度减法 题解

    想找原题请点击这里:传送门 原题: 题目描述 高精度减法 输入格式 两个整数a,b(第二个可能比第一个大) 输出格式 结果(是负数要输出负号) 输入输出样例 输入 复制 输出 复制 说明/提示 %数据 ...

  2. python字符串操作方法详解

      字符串 字符串序列用于表示和存储文本,python中字符串是不可变对象.字符串是一个有序的字符的集合,用于存储和表示基本的文本信息,一对单,双或三引号中间包含的内容称之为字符串.其中三引号可以由多 ...

  3. luogu P2280 激光炸弹(二维前缀和)

    由题给的xi, yi范围,可以建立二维地图maze[i][j],记录i j范围上的所有目标的价值总和 即有maze[xi][yi] += wi 然后接下来的目标就是求出该二维数组的前缀和 可得到前缀和 ...

  4. 嵌入式编程中使用 do{...} while(0) 的解释

    最近在看esp32的idf,有一些宏定义使用了do while(0)这种看起来好像没啥用的代码.然后我查了一下资料,发现在linux内核代码中经常用到这个东西! 现在就将这个东西整理一下. 为什么在内 ...

  5. C++面试常见问题——04链表的逆序与合并

    链表的逆序与合并 链表的逆序 已知一个链表的头指针为head,将该链表逆序. #include<iostream> using namespace std; struct Node{ in ...

  6. Write-up-Toppo

    关于 下载地址:点我 哔哩哔哩:哔哩哔哩 信息收集 vmnet8网卡,IP:192.168.131.144,开放web,ssh服务 ➜ ~ ip a show dev vmnet8 5: vmnet8 ...

  7. nmap 速查命令

    进行ping扫描,打印出对扫描做出响应的主机,不做进一步测试(如端口扫描或者操作系统探测) nmap -sP 192.168.1.0/24 仅列出指定网络上的每台主机,不发送任何报文到目标主机 nam ...

  8. 浅谈脱壳中的附加数据问题(overlay)

    Author:Lenus -------------------------------------------------- 1.前言 最近,在论坛上看到很多人在弄附加数据overlay的问题,加上 ...

  9. leetcode刷题-- 3.二分查找

    二分查找 正常实现 题解 public int binarySearch(int[] nums, int key) { int l = 0, h = nums.length - 1; while (l ...

  10. 初始化加载和导航时脚本执行的函数(初始化脚本执行环境)page.evaluateOnNewDocument

    /** * Copyright 2017 Google Inc., PhantomJS Authors All rights reserved. * * Licensed under the Apac ...