noip写题心得——选择客栈题解

这题的话是一道好题,可以有非常多的解法。我们先来分析一下题目。

很明显,看完题目后第一个反应就是搜!搜!搜!然而发现搜索肯定爆炸的,所以只能另寻他法。

其实第一个要做的事情,就是先把色调这个东西忽略掉来思考问题。因为实际上,所有的客栈的选择遵循的第一法则就是同一色调。在处理的时候完全可以分色调来处理,但是这会很不方便,但这并不妨碍我们思维。所以我们可以先把所有的客栈都看成是同一种颜色的(以下的所有分析都忽略色调,之后再把色调加进来)。

其次。我们知道客栈的选择第二法则就是两两客栈之间有客栈的咖啡馆的最低消费小于p。也就是说,对于每一个客栈i,只要找到i之前的第一个最低消费小于p的客栈g,那么从第1到第u个客栈都可以和第i个客栈组合选择。这是要转过来的第二个弯。还有一点切记,不要对于每一个i都往前搜一遍然后往后搜一遍。这样的话很明显重复了一遍。如果对于每个客栈i只考虑与i之前的客栈可否与其配对选择。那么就刚好不会重复。同时又可以使用递推。这一点也要注意

然后吧问题转化到这里,就可以开始进行列方程了。这里牵扯到了分类。一开始其实并不知道如何分类,但是问题的关键就是这个g的位置,所以肯定要求的就是g与i的关系咯。

①  当g=i时,也就是i本身最低消费小于p。这时可以配对的客栈数目为i-1,因为之前的所有客栈都可以与i配对

②  当g=i-1时,实际上可配对的数目仍然是i-1,因为之前的所有客栈到i都会夹着u

③  当g=i-2时,这时候第i-1个客栈不可以算进来。所以可配对数目是i-2

④  当g=i-n时,这时候第i-n+1到i-1个客栈不可以算进来,所以可配对的数目是i-n

这样的话,如果色调全部相同,那么我们就可以解出这道题了。

然而加进了色调的话,就不太一样了。我们首先要预处理的一个数组g[i],表示的是与在1~i内最低消费小于p而编号最大的那个。

接下来两种办法,第一种分色系处理,会比较慢,第二种则用f[i]记录在1~i-1之间与i色调相同的编号最大的那个。

还有一个,自然就是把1~i-1的相同色调个数全部统计出来的c[i]。

注意,这里能够得到这些数组,是因为之前的单色调情况下要用到的东西进而才得到这些数组的。

这时,如果g[i]在f[i]到i之间,那就好办此时的话全部可以配对,即ans[i]=c[i]

但是如果g[i]在f[i]之前的话呢。

类比之前的思考,如果g[i]在f[i]之前的话,那么从f[i]到i没有任何一个客栈可以和i配对,包括f[i]本身。而在f[i]之前的任意一个客栈ξ,如果可以和f[i]配对的话,那么ξ到f[i]之间必然有一个δ最低消费小于p。而f[i]<i,所以ξ也一定可以和i配对,所以有ans[i]=ans[f[i]]

这样,基于这两点,就可以进行递推,从而出解了

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值