题解:P11429 [COCI 2024/2025 #2] 谬误 / Paradoks
signed_long_long · · 题解
抢到第二 A 了!发篇题解纪念一下!(疑似首 A?)
题目解法
按照题意模拟即可。
可以用一个数组标记一下某个颜色加数字的组合是否被打出过,用一个
#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;
}