牛客网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; }
蒟蒻总是更懂你✿✿ヽ(°▽°)ノ✿