1. 程式人生 > >Vova and Trophies-思維

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;
    }