- 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; }
Vova and Trophies-思维
猜你喜欢
转载自blog.csdn.net/BePosit/article/details/84595362
今日推荐
周排行