NC248193. 超现实子串
描述
输入描述
输入共两行。
第一行一个数 表示序列长度。
第二行 个数 表示序列。
输出描述
输出一个数表示最长的超现实子串长度。
示例1
输入:
5 3 4 2 5 6
输出:
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; }