CodeForces - 1245 B - Restricted RPS

题目链接:题目
题目大意:
牛妹和牛弟正在玩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
#include
#include
#include
#include
#include
#include
#include
#include
#include
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; 
}

你可能感兴趣的:(贪心)