【问题标题】:Another Woodcutting Dilemma另一个木刻困境
【发布时间】:2011-11-14 08:42:11
【问题描述】:

在看到最近的 问题后,我想起了我曾经看到并解决过的一个有趣的问题,但现在忘记了解决方案。希望有人能指出我正确的方向。

您有一堆大小不一的K 块木头。你会得到C'cuts',你可以在木头的任何一点切割一块木头,将切割的两块都放回木头堆中。您的目标是确定M,即max(pile) - min(pile) 的最小值。

输入:

Line 1: Two space separated characters, K C
Lines 2..K+1: A single real number representing the length of a piece of wood (of the K).

输出:

M

约束:

K < 500 000
C < 1 000

限制

~10 sec runtime on an average PC with ~256 meg RAM limit'd.

【问题讨论】:

  • 我是个怀疑论者:这听起来太像“请做我的功课”。为什么不尝试自己(再次?)当你遇到困难时发布一个特定的编程相关问题?
  • 我向你保证我已经解决了这个问题,这是一个贪婪的解决方案。只是努力回忆细节,并希望这是我错过的一些(明显)明显的事情。
  • 输入格式建议SPOJ,硬件规格也可以。
  • 很可能最初是,我看到它的地方是 2009 年 @UCT 的算法理论问题。
  • 您应该定义max(pile)min(pile)。最长和最短板的长度似乎很可能。

标签: algorithm algorithm


【解决方案1】:

对于 {1, …, k} 中的 i,令 Li 为片段 i 的初始长度并初始化 Ci,即i, 到 0。重复 C 次:让 j = argmaxi Li/(1 + Ci) 并递增 C j.

【讨论】:

  • 如果你想让你的答案被理解,你应该更详细一点。另一个木刻问题,我才明白你的意思是很久以后的完整答案。
  • 是的,就是这样。谢谢,我一读到这里就明白你的意思了。你给所有的木头一个'cuts'计数,从0开始。你每次都贪婪地选择最大的一块,根据它的初始长度除以1 +它的'cuts'计数,并将它的'cuts'计数增加1。使用基于堆的优先级队列,我认为它可以在 O(K + ClogK) 内解决,绝对是在时间之内。谢谢!
  • 必须使用所有的 C 切割吗?如果没有,那么您可能需要尽早停止:考虑由 2 个等长的木板和 C 奇数组成的一堆。
猜你喜欢
  • 1970-01-01
  • 2022-01-23
  • 1970-01-01
  • 1970-01-01
  • 2019-07-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多