1 条题解

  • 0
    @ 2026-4-30 0:54:25

    首先,一定存在一种最优策略,其 01 反转的这一段被最终的最长交替序列完全包含。因为如果有不包含的地方,把这些去掉不参与反转,剩下的段仍然是连续的且不会缩短最终的长度。因此,只需要考虑反转的这一段被最终的最长交替序列完全包含的情况。

    由于这一段被一个交替序列完整包含,因此它本身就是一段交替序列。

    接着,会发现,对于两个符合以上条件的反转方案,如果其中一个反转区间完全包含了另一个,那么前者一定是更优的,因为它们反转后都是符合要求的交替序列,而前者更长。

    因此,可以找出原序列的所有极大交替序列,然后一一枚举将它们反转后会出现多长的交替序列,最终取最大值即可。

    #include<bits/stdc++.h>
    using namespace std;
    const int N=1e5+5;
    bool a[N];
    int arr[N];
    int main(){
    	ios::sync_with_stdio(0);cin.tie(0);
    	int n;cin>>n;
    	int l=0;
    	int lst=1;
    	for(int i=1;i<=n;i++)cin>>a[i];
    	for(int i=2;i<=n;i++){
    		if(a[i]==a[i-1]){
    			//下一段交替序列
    			arr[++l]=i-lst;
    			lst=i; 
    		}
    	}
    	arr[++l]=n+1-lst;
    	int ans=-1;
    	for(int i=1;i<=l;i++){
    		ans=max(ans,arr[i-1]+arr[i]+arr[i+1]);
    	}
    	cout<<ans;
    	return 0;
    }
    
    • 1

    信息

    ID
    9001
    时间
    1000ms
    内存
    256MiB
    难度
    10
    标签
    递交数
    2
    已通过
    1
    上传者