题目:
题意:
给定一组序列,求连续奇数偶数非空子序列的和的最大值(相邻的奇偶性不能相同)。
思路:
同最大连续子序列差不多的做法,只不过要求前一项和当前的奇偶性不同,且至少要选一项。时间O(N)
题解:
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
const int maxn=2e5+5;
int a[maxn];
int main(){
int m;
cin>>m;
while(m--)
{
int n;cin>>n;int ans=0;int ma=-12345654;
for(int i=1;i<=n;i++)cin>>a[i];
a[0]=3;
for(int i=1;i<=n;i++)
{
if(abs(a[i]%2)!=abs(a[i-1]%2))
{
if(ans<0)ans=a[i];
else{
ans+=a[i];
}
ma=max(ma,ans);
}
else
{
ans=a[i];
}
ma=max(ma,ans);
}
cout<<ma<<endl;
}
}
确实,和最长子列和思想基本相同。复杂度都是(logn);
主要操作:
先遍历一遍,在遍历过程中
1.奇偶性交替的时候进行累加,如果累加和<0,则舍去(因为它不会使和最大),改成当前的值。
2.奇偶性相同的时候直接改成当前的值。
3.每次都在操作的时候进行max操作记录出最大值,最后输出。