ZIO 2013:玩偶

时间:2016-11-18 17:45:59

标签: algorithm

您的商店出售几种不同类型的娃娃。每个玩偶都有建议的价格,没有 两种类型的娃娃价格相同。您想要确定实际售价 每个娃娃让不同类型的娃娃尽可能地价格不同。由于 一些政府规定,你只能修改固定的建议价格 ±K的带 - 换句话说,如果建议的价格是p,你可以选择任何售价 在{p-K,p-K + 1,...范围内。 。 。 ,p + K -1,p + K}。当然,售价必须 总是非负面的。 例如,假设有四种类型的玩偶,建议价格为130,210,70 和90,你可以在20的范围内修改价格。然后,你可以调整 价格分别为150,210,50和100,使价格的最小差价 在任何两种类型的娃娃之间是50。(对于第二个娃娃,你可以选择任何一个 价格在200到230之间。)你可以检查这是你最大的分离 可以达到约束条件。

在下面的每个案例中,您都会获得一系列价格和K.您的价值 必须确定所有对之间可以达到的最大间隔 如果允许您修改每个价格高达±K,则序列。

  

(a)K = 13.序列:144,152,214,72,256,3,39,117,238,280。
  (b)K = 10.顺序:10,48,57,32,61,74,33,45,99,81,19,24,101。
  (c)K = 20.序列:10,19,154,67,83,39,54,110,124,99,139,170

所以基本上,我只需要找到最大分离值而无需编码。我试图设计一种算法,但是失败了,所以我只是通过基本上将每个价格增加/减少某个值来开始强制它,但是由于K的值,这里应用的强制执行过于强硬。任何K <6)都很简单。

有人可以定义函数或递归关系来计算它吗?这些解决方案在线,但它们只给出了整数的答案,并没有解释如何达到解决方案。我是编程的初学者,所以请尝试使用伪代码/一点点C ++来解释。谢谢。

来源:http://www.iarcs.org.in/inoi/2013/zio2013/zio2013-qpaper.pdf 解决方案:http://www.iarcs.org.in/inoi/2013/zio2013/zio2013-solutions.pdf

1 个答案:

答案 0 :(得分:0)

这是一个O(nlogn)算法。

为了说明我将使用第二个例子:10,48,57,32,61,74,33,45,99,81,19,24,101,K = 10

  1. 对清单进行排序(10,19,24,32,33,45,48,57,61,74,81,99,101)
  2. 使用二分法找到最小间隔x
  3. 对于x的试验值,在满足条件的同时贪婪地分配最终值,使其尽可能小(非负值,在原始值的K值内,至少x大于之前值)。

    所以让我们从x = 10开始。 我们将按如下方式移动:

    1. 10-> 0(不能为负,所以这是最小的)
    2. 19-> 10(不能超过前一个值的K = 10)
    3. 24→20
    4. 32→30
    5. 33-→40
    6. 45-→50
    7. 48变得不可能。我们只能指定介于38和58之间的值,但这些值都不会超过之前的50。
    8. 我们得出结论,x = 10的分离度太高,我们需要向下移动。 您可以尝试x = 7并发现它是可能的,x = 9发现它是不可能的,然后尝试x = 8:

      1. 10→0
      2. 19-> 9(只能移动到值9-> 29)
      3. 24&GT; 17
      4. 32→25
      5. 33-&GT; 33
      6. 45-&GT; 41
      7. 48-&GT; 49
      8. 57-&GT; 56
      9. 61-&GT; 64
      10. 74-&GT; 72
      11. 81-&GT; 80
      12. 99-> 89
      13. 101-大于97
      14. 因此我们发现x = 8是可能的,x = 9是不可能的,因此x = 8是最大可能的分离。