1343C - Alternating Subsequence

链接:

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

上一篇:利用漏洞CVE-2018-20250模拟一次鱼叉式钓鱼邮件攻击


下一篇:HDU3530 Subsequence