Codeforces Round #318-(D. Bear and Blocks)

本文介绍了一种消除方块的算法实现,通过从左右两侧分别进行消去操作,并结合最大高度判断来解决方块消除问题。最多消去次数不会超过最高方块的高度。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这道题我上来就是想到的是暴力,每次都把表面的那一层减掉,直到所有的高度为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);
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值