有n堆方块,第i堆方块由hi个方块堆积而成。具体可以看样例。
接下来拆方块。一个方块称为内部方块当且仅当他的上下左右都是方块或者是地面。否则方块就是边界方块。每一次操作都要把边界方块拿掉。
问多少次操作之后所有方块会消失。
样例解释:
每一次操作,边界方块被标记为红色。
经过第一次操作,只剩下四个方块。第二次操作之后,只剩下一个方块。
Input
单组测试数据。 第一行有一个整数n(1≤n≤10^5)。 第二行有n个整数h1,h2,...,hn(1≤hi≤10^9),表示第i堆方块的数目。
Output
输出使得所有方块消失的操作次数。
Input示例
6 2 1 4 6 2 2
Output示例
3
#include <iostream>
#include <stdio.h>
#include <cstring>
using namespace std;
const int MAXN = 1e5 + 5;
int h[MAXN], a[MAXN];
int n;
int main()
{
cin >> n;
for (int i = 0; i < n; i++)
{
cin >> h[i];
}
a[0] = 1;
for (int i = 1; i < n; i++)
{
a[i] = min(a[i-1] + 1, h[i]);
}
a[n-1] = 1;
for (int i = n-2; i >= 0; i--)
{
a[i] = min(a[i+1] + 1, a[i]);
}
int result = 0;
for (int i = 0; i < n; i++)
{
result = max(result, a[i]);
}
cout << result << endl;
return 0;
}