3 条题解
-
1
利用栈先算出单个最长的gold,并存到一个数组里面,然后单独讨论这个数组,满足gsg格式且有大于两串g的时候可以让前后两个长度相加再加1,如果gsg格式且只有2串,那就是前面加后面的长度,如果满足gsss(s>=2)g这个格式,就是前面或后面的长度加一,最后判断所有可能的长度的最大值,输出
- p是bb数组的索引
- bb数组存每一串连续gold的长度
- b是每一串连续gold的长度
- q就是p的复制,不过后面p被更改
- a是输入进去的初始char数组
- maxb代表最长的连续gold的长度
#include<iostream> #include<algorithm> using namespace std; int n,b,p,q; int bb[1002]; int maxb=0; char a[1002]; int main() { cin>>n; for(int i=0;i<n;i++) { cin>>a[i]; } for(int i=0;i<n+1;i++) { if(a[i]=='G')b++; if(a[i]!='G'&&a[i-1]=='G') { bb[p]=b;//前一个连续g的长度 p++; b=0; } maxb=max(maxb,b);//换前最长gold } for(int i=0;i<p;i++) { if(p>=2) { maxb=max(maxb,bb[i]+1);//多s重合交换逻辑 } } q=p; p=-1; for(int i=0;i<n+1;i++)//几种情况的gold交换 { if(a[i]!='G'&&a[i-1]=='G') { p++; if(a[i+1]=='G'&&q>2) { b=bb[p]+bb[p+1]+1; maxb=max(maxb,b);//换后最长gold } if(a[i+1]=='G'&&q==2) { b=max(bb[p]+1,bb[p+1]+1); b=max(b,bb[p]+bb[p+1]); maxb=max(maxb,b);//换后最长gold } } } cout<<maxb; }
信息
- ID
- 307
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 8
- 标签
- 递交数
- 828
- 已通过
- 97
- 上传者