1. 程式人生 > >PAT1073 多選題常見計分法 (20 分)

PAT1073 多選題常見計分法 (20 分)

坑點: 

  • 看清題目,是求錯最多的選項,而不是錯最多的題目中錯最多的選項
  • 只得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