天天看点

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

题目链接:

https://pintia.cn/problem-sets/994805260223102976/problems/994805263624683520

AC代码(借鉴巨佬的:https://blog.csdn.net/xpursue/article/details/78721037):

#include<cstdio>
#include<iostream>
#include<cstring>
using namespace std;
struct choo//题目选项信息
{
    int full;//满分
    int chnum;//该题选项个数
    int an;//该题答案个数
    string ch;//正确答案组成的字符串
};

int main()
{
    int n,m,i,j,x,k,f,wr=0;
    char co;
    float s;
    cin>>n>>m;
    int wrong[m][5]={0};
    choo choo[m];
    for(i=0;i<m;i++)//遍历选项
    {
        cin>>choo[i].full>>choo[i].chnum>>choo[i].an;
        for(j=0;j<choo[i].an;j++)
        cin>>co,choo[i].ch+=co;
    }
    while(n--)//遍历学生
    {
        s=0;//每个学生的成绩
        for(i=0;i<m;i++)
    {
        scanf(" ");//便于(的输入
        string ans;
        scanf("(%d",&x);
        for(j=0;j<x;j++)
            scanf(" %c",&co),ans+=co;//必须加空格
        scanf(")");
        if(ans==choo[i].ch)s+=choo[i].full;//答案全部正确
        else
        {
            f=0;
            for(k=0;k<ans.length();k++)//错题
        {
            choo[i].ch.find(ans[k]);
            if(choo[i].ch.find(ans[k])==-1)
            //在学生选项中出现,不在正确答案中出现
            {
                wrong[i][ans[k]-'a']++;
                //在每个学生下,统计每道题的错误次数
                //最后输出错得最多的题目选项的信息
                f=1;
                if(wrong[i][ans[k]-'a']>wr)wr=wrong[i][ans[k]-'a'];//记录最大错误次数
            }
        }
        for(k=0;k<choo[i].ch.length();k++)//漏题
        {
            if(ans.find(choo[i].ch[k])==-1)
             //在正确答案中出现,不在学生选项中出现
            {
                wrong[i][choo[i].ch[k]-'a']++;
                //在每个学生下,统计每道题的错误次数
                //最后输出错得最多的题目选项的信息
                if(wrong[i][choo[i].ch[k]-'a']>wr)wr=wrong[i][choo[i].ch[k]-'a'];
                //记录最大错误次数
            }
        }
        if(f==0)s+=choo[i].full/2.0;
        }
    }
    printf("%.1f\n",s);
    }
    if(wr==0){cout<<"Too simple";return 0;}
    for(i=0;i<m;i++)//多选题的个数
    {
        for(j=0;j<5;j++)//每个多选题最多5个选项
        {
            if(wr==wrong[i][j])//错误次数最多的选项可能不止一个
                printf("%d %d-%c\n",wr,i+1,'a'+j);
                //错误次数,题目编号,选项号
        }
    }
    return 0;
}