Vova and Trophies-思维

  • http://codeforces.com/contest/1082/problem/B
  • 题意:最多可以交换一次,这一次可以交换任意两个位置的颜色,求一个最终G最多的状态是多少
  • 思路:先把G的各个部分取出来,按照结构体存储,然后开始统计一下原来单个G的联通块最长为多少,
  • 原来 相邻两个G联通快,并且之间只有一个S隔开,这时判断一下如果把这个S移除用G交换是用的哪里的G
  • 如果只有这两个G联通快本身,那么长度就是它们相加,否则可以从别处哪一个G,那么长度再+1,
  • 还有只要G超过两堆 那么最多的一堆的数目就+1,最后各种状态取一下最大值。
  • #include<bits/stdc++.h>
    using namespace std;
    string str;
    int n,len,l,r,max1,max2,s,ans,qq;
    struct node
    {
        int l,r;
    };
    vector<node>a;
    int main()
    {
        bool flag=0;
        cin>>n>>str;
        len=str.size();
        for(int i=0; i<len; i++)
        {
            if(str[i]=='G'&&flag==0)
            {
                l=i;
                flag=1;
                qq++;
            }
            if((str[i]=='S'||i==len-1)&&flag==1)
            {
                flag=0;
                if(str[i]=='S')r=i-1;
                else
                    r=i;
                a.push_back((node)
                {
                    l,r
                });
            }
        }
        s=a.size();
        for(int i=0; i<s; i++)
        {
            max1=max(a[i].r-a[i].l+1,max1);
            if(i>0&&a[i-1].r+2==a[i].l)
                max2=max(max2,a[i].r-a[i].l+2+a[i-1].r-a[i-1].l);
        }
        if(qq>=2)max1++;
        if(s>2)max2++;
        ans=max(max2,max1);
        printf("%d\n",ans);
        return 0;
    }

猜你喜欢

转载自blog.csdn.net/BePosit/article/details/84595362