列表

详情


NC248193. 超现实子串

描述

小松鼠在学习的过程中发现了一种奇怪的序列!

若一个序列 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

输入:

5
3 4 2 5 6

输出:

4

说明:

区间 [1,4] 组成的子串是最长的超现实子串。

原站题解

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

C++(g++ 7.5.0) 解法, 执行用时: 382ms, 内存消耗: 11204K, 提交时间: 2023-03-05 14:46:56

#include<bits/stdc++.h> 
using namespace std;
int a[1000005],b[1000005];
typedef long long LL;
int main(){
	int n,ma=0;
	cin>>n;
	for(int i=0;i<n;i++){
		cin>>a[i];
	}
	for(int i=0;i<n;i++)
	for(int j=1,k=1;j+i<n;k=-k){
		if(a[i+j]-a[i]==++j/2*k)
		ma=max(ma,j);
		else 
		break;
	}
	cout<<ma;
    return 0;
}
 

Python3 解法, 执行用时: 1053ms, 内存消耗: 122520K, 提交时间: 2023-03-29 16:18:05

n = int(input())
a = list(map(int, input().split()))

res = 1
i = 0
while i<n:
    j = 1
    while i+j<n:
        if (j%2==1 and a[i+j]==a[i]+(j+1)//2) or (j%2==0 and a[i+j]==a[i]-(j+1)//2):
            res = max(res, j+1)
            j += 1
        else:
            break
    i += max(j-1, 1)
print(res)

C++(clang++ 11.0.1) 解法, 执行用时: 386ms, 内存消耗: 5116K, 提交时间: 2023-03-14 18:46:35

#include<bits/stdc++.h> 
using namespace std;
int a[1<<20], n, mx;
int main()
{
	cin >> n;
	for(int i = 0; i < n; i++)
		cin >> a[i];
	for(int i = 0; i < n; i++)
		for(int j = 1, k = 1; j + i < n; k = -k)
			if(a[i+j] - a[i] == ++j / 2 * k)
				mx = max(mx, j);
			else
				break;
	cout << mx;
}

上一题