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;
}
原文地址:https://www.cnblogs.com/xiaoyezi-wink/p/11237632.html