题解:P11429 [COCI 2024/2025 #2] 谬误 / Paradoks

· · 题解

抢到第二 A 了!发篇题解纪念一下!(疑似首 A?)

题目解法

按照题意模拟即可。

可以用一个数组标记一下某个颜色加数字的组合是否被打出过,用一个 5\times 4 的数组标记一个人是否打出过非场风的牌以及场风。谬误可以用数组来存。没啥好说的,上代码:

#include<bits/stdc++.h>
using namespace std;
#define int long long
int n,cnt=0;
bool vis[5][10];
string ans[100500];
string name[]={"","IGOR","LEA","MARINO","SONJA","VIKTOR"};
int nxt[]={0,2,3,4,5,1};
bool cant[6][5];
int an[100500];
signed main(){
    cin>>n;
    int winner=4,now=winner,changfeng;
    for(int i=1;i<=n;i++){
        int maxn=-1;
        bool flag=false;//有没有红色 
        for(int j=1;j<=5;j++,now=nxt[now]){
            char ch;
            int x,y;
            cin>>ch>>y;
            if(ch=='Y') x=3;
            else if(ch=='Z') x=4;
            else if(ch=='C') x=1;
            else x=2;
            if(vis[x][y] or cant[now][x]) {
                ans[++cnt]=name[now];
                an[cnt]=i;
                continue;
            }
            if(j==1){
                changfeng=x;
            }
            vis[x][y]=true;
            if(j!=1 and changfeng!=x){
                cant[now][changfeng]=true;
            }
            if(x==1){
                if(!flag){//第一个打出红色的 
                    maxn=y;
                    winner=now;
                }else if(y>maxn){
                    maxn=y;
                    winner=now;
                }
                flag=true;
            }
            if(!flag and x==changfeng and y>maxn){
                maxn=y;
                winner=now;
            }
        }

        now=winner;
    } 
    printf("%lld\n",cnt);
    for(int i=1;i<=cnt;i++){
        printf("%lld ",an[i]);
        cout<<ans[i]<<"\n";
    }
    return 0;
}