PAT 1073. 多选题常见计分法

批改多选题是比较麻烦的事情,有很多不同的计分方法。有一种最常见的计分方法是:如果考生选择了部分正确选项,并且没有选择任何错误选项,则得到50%分数;如果考生选择了任何一个错误的选项,则不能得分。本题就请你写个程序帮助老师批改多选题,并且指出哪道题的哪个选项错的人最多。

输入格式:

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

输出格式:

按照输入的顺序给出每个学生的得分,每个分数占一行,输出小数点后1位。最后输出错得最多的题目选项的信息,格式为:“错误次数 题目编号(题目按照输入的顺序从1开始编号)-选项号”。如果有并列,则每行一个选项,按题目编号递增顺序输出;再并列则按选项号递增顺序输出。行首尾不得有多余空格。如果所有题目都没有人错,则在最后一行输出“Too simple”。

输入样例1:

  1. 3 4
  2. 3 4 2 a c
  3. 2 5 1 b
  4. 5 3 2 b c
  5. 1 5 4 a b d e
  6. (2 a c) (3 b d e) (2 a c) (3 a b e)
  7. (2 a c) (1 b) (2 a b) (4 a b d e)
  8. (2 b d) (1 e) (1 c) (4 a b c d)

输出样例1:

  1. 3.5
  2. 6.0
  3. 2.5
  4. 2 2-e
  5. 2 3-a
  6. 2 3-b

输入样例2:

  1. 2 2
  2. 3 4 2 a c
  3. 2 5 1 b
  4. (2 a c) (1 b)
  5. (2 a c) (1 b)

输出样例2:

  1. 5.0
  2. 5.0
  3. Too simple

代码如下

  1. #include<iostream>
  2. #include<vector>
  3. using namespace std;
  4. int main(){
  5. int studs,ques,num,cnum,t,maxwrongchoice=0; char ch;
  6. cin>>studs>>ques;
  7. vector<vector<int>> answer; // 一个二维vector来储存答案
  8. vector<vector<int>> wrongchoice(ques,vector<int>(5,0)); // 一个二维vector来储存错误选项
  9. vector<int> full_mark(ques); // 一个一位vector储存题目的满分分数
  10. for(int i=0;i<ques;i++){
  11. cin>>full_mark[i]>>num>>cnum;
  12. vector<int> vi(5,0);
  13. for(int j=0;j<cnum;j++){
  14. scanf(" %c",&ch);
  15. vi[ch-'a']++; // 答案对应的为一,不是答案的为0
  16. }
  17. answer.push_back(vi);
  18. }
  19. for(int i=0;i<studs;i++){
  20. double score=0;
  21. for(int j=0;j<ques;j++){
  22. vector<int> vi(5,0);
  23. int right=1,part_right=0,fault=0;
  24. if(j==0) scanf("\n");
  25. else scanf(" ");
  26. scanf("(%d",&t);
  27. for(int k=0;k<t;k++){
  28. scanf(" %c",&ch);
  29. vi[ch-'a']++;
  30. }
  31. scanf(")");
  32. for(int l=0;l<5;l++){
  33. if(vi[l]!=answer[j][l]){
  34. wrongchoice[j][l]++; // 选项与答案不符,对应的错误选项数量加一
  35. maxwrongchoice=wrongchoice[j][l]>maxwrongchoice?wrongchoice[j][l]:maxwrongchoice; // 跟新最大错误选项
  36. right=0; // 答案和选项不一样,这道题不可能是对的了
  37. if(vi[l]-answer[j][l]==1) fault=1; // 如果学生选了,答案却没有,则这道题已经是错的了
  38. }
  39. }
  40. if(right==1) score+=full_mark[j];
  41. else if(fault==1) ;
  42. else score+=full_mark[j]/2.0; // 既不是对的,又不是错的,则是半对
  43. }
  44. printf("%.1lf\n",score);
  45. }
  46. if(maxwrongchoice==0){
  47. cout<<"Too simple"; return 0;
  48. }
  49. for(int i=0;i<ques;i++){
  50. for(int j=0;j<5;j++){
  51. if(wrongchoice[i][j]==maxwrongchoice){
  52. ch='a'+j;
  53. cout<<maxwrongchoice<<" "<<i+1<<"-"<<ch<<endl;
  54. }
  55. }
  56. }
  57. return 0;
  58. }

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

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

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

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

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

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

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

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

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

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

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

  6. P1073 多选题常见计分法

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

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

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

  8. PAT 1073 Scientific Notation[字符串处理][科学记数法]

    1073 Scientific Notation(20 分) Scientific notation is the way that scientists easily handle very lar ...

  9. PAT 1073 Scientific Notation

    1073 Scientific Notation (20 分)   Scientific notation is the way that scientists easily handle very ...

随机推荐

  1. Golang 入门 : 理解并发与并行

    Golang 的语法和运行时直接内置了对并发的支持.Golang 里的并发指的是能让某个函数独立于其他函数运行的能力.当一个函数创建为 goroutine 时,Golang 会将其视为一个独立的工作单 ...

  2. 跨域时发送预检请求,tp5的restful无options方法的解决方案

    解决 跨域问题解决 问题:使用vue-resource发送delete请求时报options请求404 思考:明明发送的是delete请求,为何变成了options请求? 答:跨域情况下,PUT,DE ...

  3. _bzoj1010 [HNOI2008]玩具装箱toy【斜率优化dp】

    传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=1010 裸的斜率优化,第一次写队首维护的时候犯了个智障错误,队首维护就是维护队首,我怎么会那队 ...

  4. C#课程设计

    一.问题描述 监视文件和文件夹的变化(FileSystemWatcher 类):选择一个文件夹,单击"开始监视",该文件夹处于监视状态,此时对该文件夹如果进行操作,这些行为将显示出 ...

  5. 尺取法 POJ 3320 Jessica's Reading Problem

    题目传送门 /* 尺取法:先求出不同知识点的总个数tot,然后以获得知识点的个数作为界限, 更新最小值 */ #include <cstdio> #include <cmath> ...

  6. Styles and Themens(3)android所有主题表

    The Android platform provides a large collection of styles and themes that you can use in your appli ...

  7. Android开发学习——Android Studio配置SVN

    一.基本配置 1. 下载这个,然后双击 安装,按下图这样选 然后 傻瓜式安装 2. 进入Android studio设置:Use Command Line Client 选择浏览到第1步你本地安装 T ...

  8. 死磕 java集合之LinkedList源码分析

    问题 (1)LinkedList只是一个List吗? (2)LinkedList还有其它什么特性吗? (3)LinkedList为啥经常拿出来跟ArrayList比较? (4)我为什么把LinkedL ...

  9. 短视频SDK简单易用——来自RDSDK.COM

    锐动天地为开发者提供短视频编辑.视频直播.特效.录屏.编解码.视频转换,等多种解决方案,涵盖PC.iOS.Android多平台.以市场为导向,不断打磨并创新技术,在稳定性,兼容性,硬件设备效率优化上千 ...

  10. MSSQL 重新生成索引,重新组织索引

    > 5% 且 < = 30% ALTER INDEX REORGANIZE > 30% ALTER INDEX REBUILD WITH (ONLINE = ON)* * 重新生成索 ...