poj 1011 sticks

简单来说就是有很多长度相同的木棍,被切分为不同长度,然后要求重新拼起来,看拼起来之后,长度相同的木棍,最短是多少长度。

这里看到几个问题

  1. 拼起来之后长度应该是一样的
  2. 从条件一推断,最段长度minL应该满足total_len % minL == 0,即最小长度可以整除总长度
  3. 从结论二可以推断,拼好之后最短长度应该大于所有木棍里面最长那根木棍
  4. 同样从条件一推断,最大长度是所有木棍的总长度,也就是只能拼成一根
  5. 注意,同样存在一次都不用拼的情况。
  6. 如果可以拼好,前面的所有木棍都拼完的时候,最后一根木棍是不需要拼的,因为肯定是那么长

然后进一步,为了拼出木棍,有什么好的拼法呢?一个考虑是,将所有木棍按从大到小排序,然后进行拼,这样可以在比较接近根的地方剪掉尽可能的情况。这样就能推理出以下几个剪枝:

  1. 只需要检查可以被总长度整除的长度
  2. 只需需要检查大于等于最长单根木棍的长度
  3. 对于长度等于正在尝试的长度的木棍,直接认为已经拼好,因为不管这根木棍接哪里,都是非法的
  4. 最后一根木棍不用拼
  5. 如果有一根木棍,接上去之后刚好构成需要测试的长度,那就应该接上。这是基于以下推理:如果我们换一根更长的,显然,超出我们测试的长度,非法。如果换一根更短的,即使后面这根更短的,能拼出一根相同的长度,其效果也跟使用这根长的一样,并且由于后面更短更灵活,浪费了他补齐的功能。
  6. 如果在开始拼一根长木棍的时候,第一根拼上去,发现不能继
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值