1 条题解
-
4
要想让交叉子序列最长,你就必须一个变化数字的机会都不错过,想象一下,是不是数组都能写出如下形式:
个正的, 个负的, 个正的......
对于这里面的每一组数,我们要挑选一个最大值,并将每一组的最大值相加,就是结果
#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; } }
- 1
信息
- ID
- 760
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 7
- 标签
- 递交数
- 65
- 已通过
- 17
- 上传者