1 条题解

  • 0
    @ 2025-8-24 23:07:14

    自动搬运

    查看原文

    来自洛谷,原作者为

    avatar long_long__int
    十年 OI 一场空,不开 long long 见祖宗。||彩笔。||不拿蓝钩不改签

    搬运于2025-08-24 23:07:14,当前版本为作者最后更新于2024-12-20 21:36:06,作者可能在搬运后再次修改,您可在原文处查看最新版

    自动搬运只会搬运当前题目点赞数最高的题解,您可前往洛谷题解查看更多

    以下是正文


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

    题目解法

    按照题意模拟即可。

    可以用一个数组标记一下某个颜色加数字的组合是否被打出过,用一个 5×45\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;
    }
    
    • 1

    信息

    ID
    11116
    时间
    1000ms
    内存
    500MiB
    难度
    2
    标签
    递交数
    0
    已通过
    0
    上传者