CodeForces - 1245 B - Restricted RPS

    技术2025-09-12  89

    题目链接:题目 题目大意: 牛妹和牛弟正在玩SRP的手势游戏(R赢S,S赢P,P赢R),两人一共玩N轮,牛弟告诉了牛妹自己要出的顺序,并且给了牛妹一些限制,她只能出a个R,b个P,c个S(a+b+c=N),如果牛妹能至少赢[N/2](N/2向上取整)次,那么牛妹就赢,否则牛弟赢,如果可以赢,输出牛妹的手势顺序,任意一种方案都可以。 输入: 第一行一个整数T(1<=T<=100)表示测试样例的总数。 对于每组样例,第一行输入一个整数N(1<=N<=100),表示游戏的轮数。第二行三个整数a,b,c(0<=a,b,c<=N),保证a+b+c=N。第三行输入一个长度为N的字符串,只包含(“R”,“P”,“S”)三种字符。 输出: 对于每组样例,如果牛妹不能赢,输出(“NO”),否则输出(“YES”),接下来输出一行长度为N的字符串,表示牛妹的手势顺序,如果有多个答案,打印任意一个。 思路: 能赢则赢,不能赢则待定,待定的能出啥出啥 代码:

    #include<iostream> #include<set> #include<vector> #include<queue> #include<string.h> #include<cmath> #include<cstring> #include<algorithm> #include<stack> #include<map> using namespace std; typedef long long int ll; using namespace std; const int MAX = 2e5 + 5; int t,n; int main() { int n,m; scanf("%d",&t); while(t--) { scanf("%d",&n); int a,b,c,d[MAX],sum=0; char e[MAX]; memset(d,0,sizeof(d)); memset(e,0,sizeof(e)); scanf("%d%d%d",&a,&b,&c); scanf("%s",e); //1:R 2:S 3:P 4:待定 for(int i=0;i<n;i++) { if(e[i]=='S'&&a>0) { d[i]=1,a--; } else if(e[i]=='P'&&c>0) { d[i]=2,c--; } else if(e[i]=='R'&&b>0) { d[i]=3,b--; } else d[i]=4,sum++; } if(sum>n/2) { printf("NO\n"); continue; } printf("YES\n"); for(int i=0;i<n;i++) { if(d[i]==4) { if(a>0) { printf("R"); a--; } else if(b>0) { printf("P"); b--; } else if(c>0) { printf("S"); c--; } } else if(d[i]==1)printf("R"); else if(d[i]==2)printf("S"); else if(d[i]==3)printf("P"); } printf("\n"); } return 0; }
    Processed: 0.022, SQL: 9