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

14 篇文章 0 订阅

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

坑点: 

  • 看清题目,是求错最多的选项,而不是错最多的题目中错最多的选项
  • 只得50%那种题目,不算错
  • 正确的选项没被选上,那个 选项也算错,在错题中

#include <iostream>
#include <cstdio>
#include <algorithm>

using namespace std;

struct St
{
    int fs,gs,id;
    bool p[5] = {false};
    int nu[5] = {0};
    int ma;
} pr[105];

bool cmp(struct St a, struct St b)
{
    if(a.ma == b.ma)
        return a.id < b.id;
    return a.ma > b.ma;
}

void solve()
{
    int n, m;
    scanf("%d%d", &n, &m);
    for(int i = 0; i < m; i++)
    {
        int x;
        scanf("%d%d%d", &pr[i].fs, &x, &pr[i].gs);
        for(int j = 0; j < pr[i].gs; j++)
        {
            char y;
            scanf(" %c", &y);
            pr[i].p[y - 'a'] = true;
        }
        pr[i].id = i + 1;
        pr[i].ma = 0;
    }
    while(n--)
    {
        double re = 0;
        for(int i = 0; i < m; i++)
        {
            char y;
            scanf(" %c", &y);
            int h;
            scanf("%d", &h);
            bool fa = true;
            bool ss[5] = {false};
            for(int j = 0; j < h; j++)
            {
                scanf(" %c", &y);
                if(!pr[i].p[y - 'a'])
                    fa = false;
                ss[y - 'a'] = true;
            }
            scanf("%c", &y);
            if(h != pr[i].gs && fa)
            {
                re += pr[i].fs * 1.0 / 2;
                fa = false;
            }
            if(!fa)
            {
                for(int j = 0; j < 5; j++)
                    if(pr[i].p[j] != ss[j]){
                        pr[i].nu[j]++;
                        pr[i].ma = max(pr[i].ma, pr[i].nu[j]);
                    }
            }
            else
                re += pr[i].fs;

        }
         printf("%.1f\n", re);
    }
    sort(pr, pr + m, cmp);
    int maa = pr[0].ma;
    if(maa == 0)
        printf("Too simple\n");
    else
    {
        for(int i = 0; i < m; i++)
        {
            if(maa != pr[i].ma)
                break;
            for(int j = 0; j < 5; j++)
            {
                char x = j + 'a';
                if(pr[i].nu[j] == maa)
                    printf("%d %d-%c\n", maa, pr[i].id, x);

            }

        }
    }
    return;
}

int main()
{
    solve();
    return 0;
}

                  20分中等题,与1058有点像,增加各个选项错误的次数的数组,数据结构将错误的题目换成错误选项次数最多即可    

                                                                                                                                                                              2018年9月17日 17:19:52         

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值