Vova and Trophies-思維
阿新 • • 發佈:2018-12-01
- 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; }