PAT乙级 1058 选择题

本文展示了一个使用C++进行编程竞赛的示例代码,通过处理学生答题情况,计算每位学生的得分,并找出错误率最高的题目。代码使用了结构体、向量、排序等数据结构和算法,展示了C++在解决复杂问题时的强大能力。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#include <bits/stdc++.h>
using namespace std;
struct q
{
    int full,all,right,wrong,num;//分值,总选项数,对的选项数,错的次数,题号
    char ans[5]={0};//对的选项设置为1
};
bool cmp(q a,q b)//写错的人越多的题越靠前,若排序后最靠前的没有一个人错则全对
{
    if(a.wrong==b.wrong)
        return a.num<b.num;
    else
        return a.wrong>b.wrong;
}
int main()
{
    int n_s,n_q;
    cin>>n_s>>n_q;//总学生数,总问题数
    int stu[n_s]={0};//学生得分
    vector<q> a(n_q);//题目
    char t;
    //输入题目信息
    for(int i=0;i<n_q;i++){
        cin>>a[i].full>>a[i].all>>a[i].right;
        a[i].wrong=0;
        a[i].num=i+1;
        for(int j=0;j<a[i].right;j++){
            cin>>t;
            a[i].ans[t-'a']=1;
        }
    }
    //处理学生答案
    int n;
    for(int i=0;i<n_s;i++){
        for(int j=0;j<n_q;j++){
            cin>>t>>n;//吸收'(',输入该题学生选了几项
            int cnt=0;
            for(int k=0;k<n;k++){
                cin>>t;
                if(a[j].ans[t-'a']==1)
                    cnt++;
            }
            if(cnt==a[j].right&&cnt==n)//防止学生多选中蒙对正确答案
                stu[i]+=a[j].full;
            else
                a[j].wrong++;
            cin>>t;//t吸收')'
        }
    }
    //输出答案
    for(int i=0;i<n_s;i++)
        cout<<stu[i]<<endl;
    sort(a.begin(),a.end(),cmp);
    if(a[0].wrong==0)
        cout<<"Too simple";
    else{
        cout<<a[0].wrong;
        for(int i=0;a[i].wrong==a[0].wrong;i++)
            cout<<' '<<a[i].num;
    }
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值