牛客网20181104 TI 染色

链接:https://ac.nowcoder.com/acm/contest/176/A
来源:牛客网

fizzydavid和leo有n个方格排成一排,每个方格初始是白色。fizzydavid有红色染料,leo有蓝色染料。他们共进行了m次操作,在每次操作中,fizzydavid或者leo会选择若干个(可以是零个)连续相邻的方格并用自己的染料给这些格子染色。当一个格子被染成某个颜色时,这种染料会覆盖之前这个格子上的颜色。

现在你并不知道他们每次操作选择了哪些格子,只知道每次操作是谁进行的,以及最终这n个方格的颜色。你需要判断是否存在某种选择格子的方式使得操作完之后n个方格的颜色与给定的相同。你还发现,n个格子最终都不是白色。


首先我们求出有多少个断开的块 (左右两端的颜色与其不同)

然后是一个贪心思想

讲操作从后往前,每次去掉颜色色会少一个碎块

然后特例就是只剩两个不同颜色的时候

特判一下即可

下面给出代码:

#include<iostream>
#include<cmath>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<string>
#include<algorithm>
using namespace std;
inline int rd(){
   int x=0,f=1;
   char ch=getchar();
   for(;!isdigit(ch);ch=getchar()) if(ch=='-') f=-1;
   for(;isdigit(ch);ch=getchar()) x=x*10+ch-'0';
   return x*f;
}
inline void write(int x){
    if(x<0) putchar('-'),x=-x;
    if(x>9) write(x/10);
    putchar(x%10+'0');
    return ;
}
int T;
char ch[100006];
char s[100006];
int main(){
    T=rd();
    while(T--){
        scanf("%s%s",ch+1,s+1);
        int x=0,y=0;
        int h1=strlen(ch+1),h2=strlen(s+1);
        for(int i=1;i<=h1;){
            if(ch[i]=='R'){
                x++;
                while(ch[i]=='R') i++;
            }
            else{
                y++;
                while(ch[i]=='B') i++;
            }
        }
        for(int i=h2;i>=1;i--){
            if(s[i]=='F'){
                x--;
                if(y<=1) continue;
                y--;
            }
            else{
                y--;
                if(x<=1) continue;
                x--;
            }
        }
        if(x<=0&&y<=0) printf("Yes\n");
        else printf("No\n");
    }
    return 0;
}

猜你喜欢

转载自www.cnblogs.com/WWHHTT/p/9911542.html
TI