链接:
https://codeforces.com/problemset/problem/1343/C
题意:
子序列:原序列删减不改变顺序
要求找出最大长度,正负交叉,【正负正负…】,【负正负正…】
求最大长度的子序列的和的最大值
解:
思维题和阅读题(读题重点)
题目要求的最大长度是固定条件,所有能取都要取
只要在每个正负块里面取最大值即可
我用integer标记正负,符号不变时记录最大值,符号改变时把最大值加入答案同时更新记录,数组最后加了一个和原最后一位相反的数来弹出最后一个块的最大值
实际代码:
#include<iostream>
#include<cmath>
#include<cstring>
#include<algorithm>
#include<stdio.h>
#include<memory.h>
#include<limits>
#define csh(a) memset(a,0,sizeof(a))
using namespace std;
typedef long long int ll;
const int Size=2E5+10;
int sz[Size];
int main()
{
int T;
cin>>T;
for(int f=1;f<=T;f++)
{
csh(sz);
int n;cin>>n;
for(int i=1;i<=n;i++)
{
cin>>sz[i];
}
sz[n+1]=1;
if(sz[n]>0) sz[n+1]*=-1;
ll sum=0;
int zf=1;if(sz[1]<0) zf*=-1;
int temp=INT_MIN;
for(int i=1;i<=n+1;i++)
{
int zfbook=1;
if(sz[i]<0) zfbook*=-1;
if(zf==zfbook) temp=max(sz[i],temp);
else
{
sum+=temp;
temp=sz[i];
zf*=-1;
}
}
cout<<sum<<endl;
}
}
限制:
time limit per test
1 second
memory limit per test
256 megabytes
input
standard input
output
standard output