C++编程:(写出代码)蒟蒻做题 AC 不了,但是很擅长数由数字组成的某种序列。规定一个由 n 个正整数组成的序列,如果序列中连续的几个正整数满足 + 1 > a i+1 >a i ,则称这连续的几个正整数构成的子串为 “起飞串”。蒟蒻很擅长找到数字序列的最长 “起飞串”。但是现在有神秘力量出现,要求必须从数字序列中删除一个数字。蒟蒻想要知道哪种删除方式能使得剩下的数字保留最长的 “起飞串”。你需要帮助蒟蒻,找到所有删除方案下,能保留的最长的 “起飞串” 的长度。 输入格式 总共两行。 第一行包含一个正整数 n,代表数字序列的长度。 第二行为 n 个正整数,输入时中间用空格隔开。 输出格式 仅为一个整数,代表删除一个数字后最长的 “起飞串” 长度。
时间: 2024-02-22 16:57:04 浏览: 110
以下是完整代码:
```c++
#include <iostream>
#include <vector>
using namespace std;
const int N = 100010;
int n;
int a[N];
int f[N], g[N];
int main()
{
scanf("%d", &n);
for (int i = 0; i < n; i ++ ) scanf("%d", &a[i]);
//计算以每个位置为结尾的最长“起飞串”长度
for (int i = 0; i < n; i ++ )
{
f[i] = 1; //初始化
if (i && a[i] > a[i - 1] + 1) f[i] = f[i - 1] + 1; //如果不满足“起飞串”条件,则不更新
}
//计算以每个位置为起点的最长“起飞串”长度
for (int i = n - 1; i >= 0; i -- )
{
g[i] = 1; //初始化
if (i < n - 1 && a[i] < a[i + 1] - 1) g[i] = g[i + 1] + 1; //如果不满足“起飞串”条件,则不更新
}
int res = 0;
for (int i = 0; i < n; i ++ )
{
int len = f[i]; //以当前位置为结尾的最长“起飞串”长度
if (i < n - 1 && a[i] < a[i + 1] - 1) len += g[i + 1]; //如果当前位置不是序列中最后一个数字,并且可以和后面的数字组成“起飞串”,则更新len
res = max(res, len); //更新答案
}
printf("%d", res);
return 0;
}
```
阅读全文