T89353 【BIO】RGB三角形
T89353 【BIO】RGB三角形
题解
对于这个题目有一个规律:
如果一个数列的长度为 3k+1(0<=k) 那么,这个数列最终缩放成的一个字母只和这个数列的首项,尾项有关
所以我们可以先判断输入的这个数列长度是否为 3k+1(0<=k) ,如果是,那就直接处理好了
否则就找到一个最大的 3k+1,然后把这个数列划分成更多的这么长的小区间,一点点处理
每次处理后序列长度都会缩短,那么相应的 3k+1也要更新
最后处理到只剩下一个字母啦,就是答案了
代码
#include<iostream> #include<cstdio> #include<string> #include<cstring> #include<algorithm> #include<cmath> #include<cstdlib> #include<queue> using namespace std; inline int read() { int ans=0; char last=' ',ch=getchar(); while(ch<'0'||ch>'9') last=ch,ch=getchar(); while(ch>='0'&&ch<='9') ans=ans*10+ch-'0',ch=getchar(); if(last=='-') ans=-ans; return ans; } int n,len,m; int l[20]={2,4,10,28,82,244,730,2188,6562,19684,59050,177148,531442,1594324,4782970}; string s; int main() { // freopen("t5.in","r",stdin); // freopen("yy.txt","w",stdout); n=read();m=n; cin>>s; if(n==1) { cout<<s[0]; return 0; } while(m) { for(int i=0;i<15;i++) { if(l[i]<=m) len=l[i]; else break; } if(len==m) { char a1=s[0],a2=s[m-1],a3; if(a1==a2) a3=a1; if((a1=='R'&&a2=='G')||(a1=='G'&&a2=='R')) a3='B'; if((a1=='R'&&a2=='B')||(a1=='B'&&a2=='R')) a3='G'; if((a1=='B'&&a2=='G')||(a1=='G'&&a2=='B')) a3='R'; cout<<a3<<endl; return 0; } for(int i=0;i<m-len+1;i++ ) { char a1=s[i],a2=s[i+len-1]; if(a1==a2) s[i]=a1; if((a1=='R'&&a2=='G')||(a1=='G'&&a2=='R')) s[i]='B'; if((a1=='R'&&a2=='B')||(a1=='B'&&a2=='R')) s[i]='G'; if((a1=='B'&&a2=='G')||(a1=='G'&&a2=='B')) s[i]='R'; } m-=(len-1); } cout<<s[0]; return 0; }