题目链接:点击查看

题目大意:1058的升级版,批改多选题,全对得满分,半对的半分,有错误选项不得分,最后统计出每个学生的成绩,以及哪个题目的哪个选项错误的次数最多,若有并列,依次输出

题目分析:目前为止pat里最恶心的模拟题,没有之一,并且这个题目不知道是不是有一个很奇怪的测试点把我卡了,网上去找题解也没找到关于那个测试点的描述,在努力了一个下午加一个晚上之后选择放弃(nmd,为了追求完美浪费了那么多时间,这什么破题?)因为熟练的运用stl,所以这个题目的实现并不是那么麻烦,但就是得不了满分,不知道为什么

需要注意的就是,错误选项有两个概念:

  1. 学生选上的选项里的错误选项
  2. 学生未选上的正确选项

我们都需要统计次数

直接挂代码吧,懒得做了,18分的菜鸡代码:

#include<iostream>
#include<cstdlib>
#include<string>
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<climits>
#include<cmath>
#include<cctype>
#include<stack>
#include<queue>
#include<list>
#include<vector>
#include<set>
#include<map>
#include<sstream>
#include<unordered_map>
using namespace std;typedef long long LL;const int inf=0x3f3f3f3f;const int N=110;int mark[N];//分数 格式:mark[题号]=分数 unordered_map<string,bool>mp[N];//正确答案 格式:mp[题号][答案]=是否存在 unordered_map<char,bool>mmp[N];//正确答案 格式:mmp[题号][每一个正确选项]=是否存在 int cnt[N][150]={0};//错题选项 格式:cnt[题号][选项]=个数 (选项我是用ASCII码来储存的) double ans[N*10]={0};//分数 格式:ans[学生序号]=分数int main()
{
//  freopen("input.txt","r",stdin);int n,m;scanf("%d%d",&n,&m);for(int i=1;i<=m;i++){int num;scanf("%d%*d%d",mark+i,&num);char ch[5];string s;for(int j=0;j<num;j++){scanf("%s",ch);s+=ch[0];mmp[i][ch[0]]=true; }mp[i][s]=true;}getchar();//注意!!!在cin或scanf与getline或gets连用时,已经记住要用getchar吃掉回车for(int i=1;i<=n;i++){string s;getline(cin,s);//直接读一行,即当前学生的所有答案for(int i=0;i<s.size();i++)//去掉所有的括号if(s[i]=='('||s[i]==')')s.erase(s.begin()+i);stringstream ss(s);int num;char ch[5];int pos=1;//题号 while(ss>>num){unordered_map<char,bool>mpmp;//记录学生选了哪些选项mpmp.clear(); string res;bool flag=true;//是否有错误选项存在 while(num--){ss>>ch;res+=ch[0];mpmp[ch[0]]=true;if(!mmp[pos][ch[0]])//如果有错误选项 {flag=false;cnt[pos][ch[0]]++;//记录选错的编号 }}if(!flag)//有错误选项,记录一下有哪些正确选项没有选上 {string temp;//本个题目的正确答案 for(auto it=mp[pos].begin();it!=mp[pos].end();it++)temp=it->first;for(int j=0;j<temp.size();j++)//遍历一遍正确答案,看一看该学生少了哪些答案 {if(!mpmp[temp[j]])cnt[pos][temp[j]]++;//记录错误选项的次数 }}else//没有错误选项 {if(mp[pos][res])//全对得全分 ans[i]+=mark[pos];else//半对的一半分{ans[i]+=double(mark[pos])*0.5;string temp;//本个题目的正确答案 for(auto it=mp[pos].begin();it!=mp[pos].end();it++)temp=it->first;for(int j=0;j<temp.size();j++)//遍历一遍正确答案,看一看该学生少了哪些答案 {if(!mpmp[temp[j]])cnt[pos][temp[j]]++;//记录错误选项的次数 }} }   pos++;}}for(int i=1;i<=n;i++)printf("%.1f\n",ans[i]);int mmax=0;//记录最多的错误选项个数 for(int i=1;i<=m;i++)for(int j='a';j<='e';j++)mmax=max(mmax,cnt[i][j]);if(mmax==0)//没有错题 cout<<"Too simple"<<endl;else{for(int i=1;i<=m;i++)//遍历所有的题目{for(int j='a';j<='e';j++){if(cnt[i][j]==mmax)printf("%d %d-%c\n",mmax,i,j);}} }return 0;
}

PAT (Basic Level) 1073 多选题常见计分法(恶心模拟)相关推荐

  1. 【PAT乙级】1073 多选题常见计分法 (20 分)

    题目地址 #include<cstdio> #include<iostream> using namespace std; int n,m; struct node//题 {i ...

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

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

  3. C++学习之路 | PTA乙级—— 1073 多选题常见计分法 (20 分)(精简)

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

  4. 1073 多选题常见计分法

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

  5. 1073 多选题常见计分法 (20 分)_66行代码AC

    立志用最少的代码做最高效的表达 PAT乙级最优题解-->传送门 批改多选题是比较麻烦的事情,有很多不同的计分方法.有一种最常见的计分方法是:如果考生选择了部分正确选项,并且没有选择任何错误选项, ...

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

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

  7. 1073 多选题常见计分法 (20 分)(注意测试点4)

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

  8. PAT (Basic Level) Practice (中文)答案合集

    准备复试专用,目标刷完全部中文题! 1001 害死人不偿命的(3n+1)猜想 (15 分) 卡拉兹(Callatz)猜想: 对任何一个正整数 n,如果它是偶数,那么把它砍掉一半:如果它是奇数,那么把 ...

  9. PAT (Basic Level) Practice (中文)题目集合

    1001 害死人不偿命的(3n+1)猜想 (15 分) #include<bits/stdc++.h> using namespace std;int n, ans; int main() ...

最新文章

  1. CVPR 2021 | RfD-Net: 从点云中重建三维物体实例
  2. oracle中asm磁盘不足,Oracle用户无法访问ASM磁盘组问题
  3. 广州市科目三电子路考--大观路通过经验
  4. oracle报无效月份 注册表,在oracle中插入时间时出现“无效的月份”解决方法
  5. 怎么让同网络计算机强制关机,知道局域网ip怎么关机
  6. _CrtCheckMemory
  7. python代码换行快捷键_python中怎么代码换行
  8. GBase数据库监控
  9. 利用STM32和可控硅控制220V加热电路
  10. 生存分析统计方法选择,可以避免的一些坑
  11. Oracle的逻辑读和物理读
  12. 本机修改虚拟机linux中的代码文件
  13. 炒股养家、退学炒股、92科比、瑞鹤仙、著名刺客,孙国栋一线游资交割单数据
  14. pytest_bdd.exceptions.FeatureError: Step definition outside of a Scenario or a Background.
  15. git本地用户配置,及邮箱配置
  16. oracle基本建表语句
  17. Python期末总结
  18. 5月10日云栖精选夜读:阿里专家直击前端盛会JSConf2017_Day2:见证Moment.js精彩分享
  19. springboot 在线程中注入bean,解决注入bean为null的问题
  20. 使用R语言画圆弧条形图

热门文章

  1. Eureka-提供者与消费者
  2. Nginx配置成系统服务
  3. MyBatis 实际使用案例-settings
  4. 类的加载过程一:Loading
  5. 数据类型转换_强制转换
  6. Fegion-3覆写Fegion的默认配置及Fegion的日志
  7. 从数据类型 nvarchar 转换为 numeric 时出错_Python数据分析类库系列Numpy之ndarray的数据类型...
  8. python iloc函数_python选取特定列 pandas iloc,loc,icol的使用详解(列切片及行切片)
  9. liunxC下零碎知识点的总结
  10. WPF企业内训全程实录(中)