这道题我上来就是想到的是暴力,每次都把表面的那一层减掉,直到所有的高度为0为止。但是T了。
题意:
现在有n个方格,然后每个方格都有一个高度,然后每次都可以把那些非完整块(就是它的四个方向没有被完全包围)给连在一起消去。问你最后把所有的方块消去需要几次。
思路:
我们只需要从左边,右边分别进行一次消去,然后最后进行一次判断就好了。最多的次数不可能超过最大的那个的高度。
首先初始化为h1[0]=0,h2[n+1]=0, 我们设两个数组h1代表的是从左边开始消去每次的最大高度,h2则是右边的。
h1[i]=min(h[i],h1[i-1]+1);
h2[i]=min(h[i],h2[i+1]+1);
这两个方程应该想一下就能明白的。我们每次当然应该满足高度较小的那个。
#include<stdio.h>
#include<string.h>
#include<iostream>
#include<algorithm>
#include<math.h>
#include<vector>
using namespace std;
#define inf 99999999
#define maxn 100010
int h[maxn];
int h1[maxn],h2[maxn];
int main(){
int n;
scanf("%d",&n);
for(int i=1;i<=n;i++) scanf("%d",&h[i]);
int ans=0;
h1[0]=0;
for(int i=1;i<=n;i++){
h1[i]=min(h[i],h1[i-1]+1);
}
h2[n+1]=0;
for(int i=n;i>=1;i--){
h2[i]=min(h[i],h2[i+1]+1);
}
for(int i=1;i<=n;i++){
ans=max(ans,min(h1[i],h2[i]));
}
printf("%d\n",ans);
}