这道题我上来就是想到的是暴力,每次都把表面的那一层减掉,直到所有的高度为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); }
版权声明:本文为博主原创文章,未经博主允许不得转载。
时间: 2024-10-07 23:07:06