CodeForces 1082B Vova and Trophies(模拟)

传送门

题目大意就是让一个'S'和'G'更换一下位置,然后更换后的字符串里连续'G'串的最大长度。

用一个Gnt1记录第一段一共有多少个'G‘,Gnt2记录第二段有几个'G',立一个flag来记录序列是否终止,即遇到'S'更新flag的值,同时也更新前边隔段的数值为零。用ans记录当前为止相邻两段最长的'G'序列,这里我们假设'S'可以和这两段外的另外的'G'进行更换,等到最后和总的'G'的个数Gnt比,若比Gnt大则说明我们假设错误,把ans更新为Gnt即可,否则则说明假设正确,直接输出即可。附代码如下:

#include<iostream>
#include<cstdio>
using namespace std;
int main()
{
    int n;
    char ch[100100];
    scanf("%d",&n);
    getchar();
    scanf("%s",ch);
    int Gnt = 0,Gnt1 = 0,Gnt2 = 0,flag = 0,ans = 0;
    for(int i = 0;i < n; i++)
    {
        if(ch[i] == 'G')
        {
            Gnt++;
            if(!flag)
                Gnt1++;
            if(flag)
                Gnt2++;
        }
        else
        {
            flag = !flag;
            if(!flag)
                Gnt1 = 0;
            else
                Gnt2 = 0;
        }
        ans = max(ans,Gnt1 + Gnt2 + 1);
    }
    if(ans > Gnt)
        ans = Gnt;
    printf("%d",ans);
    return 0;
}

猜你喜欢

转载自blog.csdn.net/xiao__hei__hei/article/details/84728089
今日推荐