1 条题解

  • 3
    @ 2024-7-16 20:42:00

    要想让交叉子序列最长,你就必须一个变化数字的机会都不错过,想象一下,是不是数组都能写出如下形式:

    a1a_1 个正的,a2a_2 个负的,a3a_3 个正的......

    对于这里面的每一组数,我们要挑选一个最大值,并将每一组的最大值相加,就是结果

    #include<bits/stdc++.h>
    using namespace std;
    long long a[200005],maxi[200005];
    int main(){
    	int t;
    	cin>>t;
    	for(int i=1;i<=t;i++){
    		int n,cnt=1;
    		long long ans=0;
    		cin>>n;
    		for(int j=1;j<=n;j++) maxi[j]=0;
    		for(int j=1;j<=n;j++) cin>>a[j];
    		maxi[1]=a[1];
    		for(int j=2;j<=n;j++){
    			if(a[j]*a[j-1]>0ll) maxi[cnt]=max(maxi[cnt],a[j]);//如果正负性未发生变化,继续取max值
    			else maxi[++cnt]=a[j];//如果发生了变化,在一个新位置存储这个发生了正负性变化的数
    		}
    		for(int j=1;j<=cnt;j++) ans+=maxi[j];
    		cout<<ans<<endl;
    	}
    }
    

    信息

    ID
    760
    时间
    1000ms
    内存
    256MiB
    难度
    7
    标签
    (无)
    递交数
    60
    已通过
    12
    上传者