3 条题解

  • 1
    @ 2025-11-4 22:49:14

    利用栈先算出单个最长的gold,并存到一个数组里面,然后单独讨论这个数组,满足gsg格式且有大于两串g的时候可以让前后两个长度相加再加1,如果gsg格式且只有2串,那就是前面加后面的长度,如果满足gsss(s>=2)g这个格式,就是前面或后面的长度加一,最后判断所有可能的长度的最大值,输出

    1. p是bb数组的索引
    2. bb数组存每一串连续gold的长度
    3. b是每一串连续gold的长度
    4. q就是p的复制,不过后面p被更改
    5. a是输入进去的初始char数组
    6. 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
    上传者