PAT 1073. 多选题常见计分法

PAT 1073. 多选题常见计分法

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

代码如下

#include<iostream>
#include<vector>
using namespace std;
int main(){
    int studs,ques,num,cnum,t,maxwrongchoice=0;  char ch;
    cin>>studs>>ques;
    vector<vector<int>> answer; // 一个二维vector来储存答案
    vector<vector<int>> wrongchoice(ques,vector<int>(5,0));  // 一个二维vector来储存错误选项
    vector<int> full_mark(ques); // 一个一位vector储存题目的满分分数
    for(int i=0;i<ques;i++){
        cin>>full_mark[i]>>num>>cnum;
        vector<int> vi(5,0);
        for(int j=0;j<cnum;j++){
        scanf(" %c",&ch);
        vi[ch-'a']++; // 答案对应的为一,不是答案的为0
        }
        answer.push_back(vi);
    }
    for(int i=0;i<studs;i++){
        double score=0;
        for(int j=0;j<ques;j++){
            vector<int> vi(5,0);
            int right=1,part_right=0,fault=0;
            if(j==0) scanf("\n");
            else scanf(" ");
            scanf("(%d",&t);
            for(int k=0;k<t;k++){
                scanf(" %c",&ch);
                vi[ch-'a']++;
            }
            scanf(")");
            for(int l=0;l<5;l++){
                if(vi[l]!=answer[j][l]){
                    wrongchoice[j][l]++; // 选项与答案不符,对应的错误选项数量加一
                    maxwrongchoice=wrongchoice[j][l]>maxwrongchoice?wrongchoice[j][l]:maxwrongchoice; // 跟新最大错误选项
                    right=0;  // 答案和选项不一样,这道题不可能是对的了
                if(vi[l]-answer[j][l]==1) fault=1; // 如果学生选了,答案却没有,则这道题已经是错的了
                }
            }
            if(right==1) score+=full_mark[j];
            else if(fault==1) ;
            else  score+=full_mark[j]/2.0;  // 既不是对的,又不是错的,则是半对
        }
        printf("%.1lf\n",score);
    }
    if(maxwrongchoice==0){
        cout<<"Too simple"; return 0;
    }
    for(int i=0;i<ques;i++){
        for(int j=0;j<5;j++){
            if(wrongchoice[i][j]==maxwrongchoice){
            ch='a'+j;
            cout<<maxwrongchoice<<" "<<i+1<<"-"<<ch<<endl;
            }
        }
    }
return 0;
}

原文地址:https://www.cnblogs.com/A-Little-Nut/p/8146476.html

时间: 2024-08-02 02:58:32

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

PAT乙级1073-----多选题常见计分法 (20分)

1073 多选题常见计分法 (20分) 思路: 1.错选的和未选的都计入错误信息 2.错误信息的输出应该是  MAX某道题某选项的错误次数+题号+选项 首次通过代码: 1 #include<stdio.h> 2 #include<stdlib.h> 3 #include<string.h> 4 5 typedef struct answer{ 6 int s_sum; 7 int r_s_sum; 8 int score; 9 int w_sum; 10 int rig

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

批改多选题是比较麻烦的事情,有很多不同的计分方法.有一种最常见的计分方法是:如果考生选择了部分正确选项,并且没有选择任何错误选项,则得到 50% 分数:如果考生选择了任何一个错误的选项,则不能得分.本题就请你写个程序帮助老师批改多选题,并且指出哪道题的哪个选项错的人最多. 输入格式: 输入在第一行给出两个正整数 N(≤1000)和 M(≤100),分别是学生人数和多选题的个数.随后 M 行,每行顺次给出一道题的满分值(不超过 5 的正整数).选项个数(不少于 2 且不超过 5 的正整数).正确选

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

1073 Scientific Notation(20 分) Scientific notation is the way that scientists easily handle very large numbers or very small numbers. The notation matches the regular expression [+-][1-9].[0-9]+E[+-][0-9]+ which means that the integer portion has exa

PAT 1073. Scientific Notation (20)

1073. Scientific Notation (20) Scientific notation is the way that scientists easily handle very large numbers or very small numbers. The notation matches the regular expression [+-][1-9]"."[0-9]+E[+-][0-9]+ which means that the integer portion

分库分表的几种常见玩法及如何解决跨库查询等问题

在谈论数据库架构和数据库优化的时候,我们经常会听到"分库分表"."分片"."Sharding"-这样的关键词.让人感到高兴的是,这些朋友所服务的公司业务量正在(或者即将面临)高速增长,技术方面也面临着一些挑战.让人感到担忧的是,他们系统真的就需要"分库分表"了吗?"分库分表"有那么容易实践吗?为此,笔者整理了分库分表中可能遇到的一些问题,并结合以往经验介绍了对应的解决思路和建议. 垂直分表 垂直分表在日常开

PAT 1073

简单题,字符串处理,写的有点乱 1 import java.util.*; 2 import java.io.*; 3 4 class FastReader{ 5 BufferedReader reader; 6 StringTokenizer tokenizer; 7 8 public FastReader(InputStream stream){ 9 reader = new BufferedReader(new InputStreamReader(stream), 1 << 22); 1

51nod 1073约瑟夫环 递归公式法

约瑟夫环问题的原来描述为,设有编号为1,2,--,n的n(n>0)个人围成一个圈,从第1个人开始报数,报到m时停止报数,报m的人出圈,再从他的下一个人起重新报数,报到m时停止报数,报m的出圈,--,如此下去,直到所有人全部出圈为止.当任意给定n和m后,设计算法求n个人出圈的次序.  稍微简化一下. 问题描述:n个人(编号0~(n-1)),从0开始报数,报到(m-1)的退出,剩下的人继续从0开始报数.求胜利者的编号. 利用数学推导,如果能得出一个通式,就可以利用递归.循环等手段解决.下面给出推导的

PAT A1063——set的常见用法详解

1063 Set Similarity Given two sets of integers, the similarity of the sets is defined to be N?c??/N?t??×100%, where N?c?? is the number of distinct common numbers shared by the two sets, and N?t?? is the total number of distinct numbers in the two se

[PAT] 1073 Scientific Notation (20 分)Java

Scientific notation is the way that scientists easily handle very large numbers or very small numbers. The notation matches the regular expression [+-][1-9].[0-9]+E[+-][0-9]+ which means that the integer portion has exactly one digit, there is at lea