列表

详情


NC248202. 超现实子序列

描述

小松鼠很喜欢这个序列,所以他想再出一道题来考考你!

若一个序列 s 满足:
s_n=s_1+(-1)^n\lfloor\frac{n}{2}\rfloor
则称这个序列是超现实序列

即长度为 n 的序列形如 \{s_1,s_1+1,s_1-1,s_1+2,s_1-2,s_1+3,s_1-3,\dots\}

给定 a,求出其最长的超现实子序列 s 的长度。

输入描述

输入共两行。
第一行一个正整数 ,第二行 n 个正整数

输出描述

一行一个正整数表示最长长度。

示例1

输入:

4
3 4 2 5

输出:

4

示例2

输入:

6
2 4 5 7 3 6

输出:

4

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++(g++ 7.5.0) 解法, 执行用时: 847ms, 内存消耗: 8240K, 提交时间: 2023-03-02 19:47:40

#include<bits/stdc++.h>
using namespace std;
long long n,a[1000001],i,j,b,c,d;
int main()
{
    scanf("%lld",&n);
    for(i=1;i<=n;i=i+1)scanf("%lld",&a[i]);
    for(i=1;i<=min(n,1000ll);i=i+1)
    {
    	b=1;c=1;
    	for(j=i+1;j<=n;j=j+1)
		if(a[j]==a[i]+c)
		{
			b=b+1;c=-c;
			if(c>0)++c;
		}
		d=max(d,b);
	}
	cout<<d;
    return 0;
}

C++(clang++ 11.0.1) 解法, 执行用时: 703ms, 内存消耗: 4324K, 提交时间: 2023-03-03 11:22:24

#include<bits/stdc++.h>
using namespace std;
int n, a[1<<20], b, c, d;
int main()
{
	scanf("%d", &n);
	for(int i = 1; i <= n; i++)
		scanf("%d", a + i);
	for(int i = 1; i <= min(n, 500); i++)
	{
		b = c = 1;
		for(int j = i + 1; j <= n; j++)
			if(a[j] == a[i] + c)
				b++, c = -c, c += c > 0;
		d = max(d, b);
	}
	cout << d;
}

上一题