版权声明:iQXQZX https://blog.csdn.net/Cherishlife_/article/details/85257602
补番计划
Time Limit: 1000 ms Memory Limit: 65536 KiB
Problem Description
由于十月新番更新实在太慢,JH只好开始了自己的补番计划。
JH将自己的想要补得番剧编号按照从小到大得顺序排好记录在便签上(已知番剧编号最小是1,最大是1000)。
现在你想要捉弄一下他,于是准备抹去其中连续的几个编号,但你又不希望激怒JH,于是希望修改后的补番计划能够唯一的被还原。(详情见下方提示)
现在你想知道在满足上述条件下最多能抹掉几个编号。
Input
多组输入,到文件结束为止,
每组数据第一行输入一个的整数 n 代表补番计划里的番剧数量( 1 <= n <= 100),
第二行由空格分隔 n 个正整数代表补番计划中的编号 ai ( 1 ≤ a1 < a2 < ⋯ < an ≤ 1000 ) 。
Output
输出满足题意的最长删除长度。
Sample Input
6 1 3 4 5 6 9
Sample Output
2
Hint
对于样例
可以删除4,5 删除后变成1 3 - - 6 9
3到6之间只有4,5两个数,因此还原是唯一的。
对于数据
5
1 2 3 4 5
答案应该是4,因为可以删除1, 2, 3, 4使得序列变成- - - - 5, 由于编号最小为1,所以还原的方式也是唯一的。
Source
行走的二叉树
#include <bits/stdc++.h>
using namespace std;
int main()
{
int n;
int a[111];
while (cin >> n)
{
memset(a, 0, sizeof(a));
for (int i = 0; i < n; i++)
cin >> a[i];
int ans = 0, cnt = 0;
if (a[0] == 1 && a[1] == 2)
{
for (int i = 0; i < n; i++)
{
if (a[i] + 1 == a[i + 1])
cnt++;
else
break;
}
ans = max(ans, cnt);
}
for (int i = 0; i < n - 1;)
{
int j, t = a[i];
cnt = 0;
for (j = i + 1; j < n; j++)
{
if (t + 1 == a[j])
{
cnt++;
t = a[j];
}
else
{
break;
}
}
i = j;
ans = max(ans, cnt - 1);
}
if (a[n - 1] == 1000 && a[n - 2] == 999)
{
cnt = 1;
for (int i = n - 2; i >= 0; i--)
{
if (a[i] - 1 == a[i - 1])
{
cnt++;
}
else
break;
}
ans = max(ans, cnt);
}
cout << ans << endl;
}
return 0;
}