D. Boris and His Amazing Haircut(线段树)

该问题是一个关于算法的编程挑战,给定两个数组表示当前头发长度和目标发型,以及一组剪刀高度,判断能否用这些剪刀完成发型。关键在于分析不能完成的情况和优化策略,如从高到低使用剪刀,以及如何利用线段树找到区间最大值来确定是否需要额外剪刀。

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

传送门

题意:

思路:

首先分析一定剪不出发型的可能:

1)现在的头发长度小于要剪的头发长度

2)要剪的发型的长度没有对应的剪刀

然后对于剩下的情况,我们剪头发肯定是要从高的剪刀开始剪,因为处理完高的情况可以处理低的头发,但是对于低的情况一定处理不了高的头发了。然后考虑某个区间[l,r],如果,并且在[l+1,r-1]上,那么这一把剪刀可以把l和r两个点的发型都完成。

就相当于如果对于两个相邻的相同的,如果最大值不大于,那么就不需要花费额外的剪刀;否则就需要多花费一把剪刀。那么就可以简化为对于某一种长度的头发x,遍历他的下标,如果有区间的最大值大于x就需要的剪刀数++(最少剪刀要一把),然后遍历完之后如果存在的剪刀数小于需要的剪刀数就可以直接标记,最后直接输出答案即可。

这里找区间最大值我用的是线段树,用树状数组也是可以的(自己找罪受)。

代码:

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值