PAT (Basic Level) Practice (中文)1073 多选题常见计分法


思路 

1、将答案转化为数字形式,比如a、b、e,数字表示为11001,方便对比和计算;

2、对于“指出哪道题的哪个选项错的人最多”这句话,可能换句话好理解一些:哪道题的哪个选项错误次数最多。建一个err[100][5]二维数组来记录,具体计算方式见下;

3、关于每个人得分的计算,使用选对个数(cnt)来辅助计算,对于回答的每一道题,遍历正确的答案和自己的回答,有以下几种情况:

①答案有,没选(correct[c][j]==1&&answer[c][j]==0):err[c][j]++表示选项错误次数+1;

②答案有,选了(correct[c][j]==1&&answer[c][j]==1):cnt++表示选对个数+1;

③答案没有,没选(correct[c][j]==0&&answer[c][j]==0):不做处理;

④答案没有,选了(correct[c][j]==0&&answer[c][j]==1):err[c][j]++表示选项错误次数+1,cnt=-10表示选对个数变为负数;

每个人的得分根据选对个数cnt与正确答案个数correct_cnt进行对比得出,详见代码;

5、最后遍历可得到错误最多的选项,注意Too simple的输出。


AC代码

#include<stdio.h>
#include<string.h>
int main(){
    int n,m,err[100][5]={0},score[100]={0},correct_cnt[100]={0};
    int correct[100][5]={0},ch,Max=0;
    scanf("%d %d",&n,&m);
    for(int i=0;i<m;i++){
        scanf("%d %*d %d",&score[i],&correct_cnt[i]);
        while((ch=getchar())!='\n'){
            if(ch>='a'&&ch<='e')correct[i][ch-'a']=1;//correct将答案转为数字形式
        }
    }
    for(int i=0;i<n;i++){
        int answer[100][5]={0},c=0;//answer将回答转化为数字形式,c来匹配题目序号
        float sum=0;//sum计算每人分数
        while((ch=getchar())!='\n'){//每个人
            if(ch=='('){//每人回答的每道题
                int cnt=0;//cnt计算每道题的回答正确个数
                while((ch=getchar())!=')'){//每道题的回答
                    if(ch>='a'&&ch<='e')answer[c][ch-'a']=1;
                }
                for(int j=0;j<5;j++){//匹配答案
                    if(correct[c][j]==0&&answer[c][j]==0)continue;
                    if(correct[c][j]==0&&answer[c][j]==1){err[c][j]++;cnt=-10;}//选错
                    if(correct[c][j]==1&&answer[c][j]==0)err[c][j]++;//没选
                    if(correct[c][j]==1&&answer[c][j]==1)cnt++;//选对
                }
                if(cnt>0&&cnt==correct_cnt[c])sum+=score[c];//全对,满分
                if(cnt>0&&cnt!=correct_cnt[c])sum+=(float)score[c]/2;//漏选,得一半分
                c++;//下一题
            }
        }
        printf("%.1f\n",sum);
    }
    for(int i=0;i<m;i++){//找错误最多的选项
        for(int j=0;j<5;j++)if(err[i][j]>Max)Max=err[i][j];
    }
    if(Max==0)printf("Too simple");//没错的情况
    else{
        for(int i=0;i<m;i++){
            for(int j=0;j<5;j++){
                if(err[i][j]==Max)printf("%d %d-%c\n",Max,i+1,'a'+j);
            }
        }
    }
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Dragon_dd

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值