如何使用二分搜索解决SPOJ:SCALE?

时间:2016-07-16 01:18:18

标签: algorithm scale dynamic-programming binary-search brute-force

http://www.spoj.com/problems/SCALE/ 我试图使用递归但是获得TLE。 问题的标签说BINARY SEARCH。 如何使用二分搜索来做到这一点? 提前完成。

2 个答案:

答案 0 :(得分:0)

首先要注意的是,如果你有每个大小的两个权重而不是一个,那么问题就会非常简单,因为我们只需要代表X在其基础3表示中并采用相应数量的权重。例如,如果X=21,那么我们可以两次P_3和一次P_2,并将它们放到另一个范围内。

现在让我们尝试使用添加到两个比例(包括放置X的那个)的事实来做类似的事情:

  1. 假设X <= P_1+P_2+...+P_n,这意味着X <= P_n + (P_n-1)/2(很容易理解为什么)。因此,X + P_(n-1) + P_(n-2)+...+P_1 < 2*P_n
  2.   

    (*)这意味着,如果我们将某些权重从1添加到n-1到与X相同的比例,那么在那个规模上仍然   在2 - 最右边的数字(0或1)中没有n

    从现在开始假设digit表示base-3表示中的数字的数字(但它可以暂时大于2:P)。现在,我们将第一个比例(放置X的位置)的总权重表示为A=X,另一个比例为B=0,我们的目标是使它们相等(A B会随着我们的进步而改变。 让我们遍历A的所有数字,从最小到最大(最左边)。如果当前数字索引是i且它:

    1. 等于0然后忽略并继续进行
    2. 等于1,然后我们将重量P_i=3^(i-1)放在比例B上。
    3. 等于2,然后我们将P_i=3^(i-1)添加到比例A。请注意,这会导致数字(i+1)增加。
    4. 等于3(是的,这种情况是可能的,如果当前和前一个数字都是2)将1添加到索引i+1的数字并进一步(不是权重被添加到任何比例)。
    5. 由于(*)显然程序将正确运行(因为最后一位数将等于1中的A),因为我们将从集合和地点中仅选择一个权重它们是正确的,显然,在程序完成后,数字AB将相等。

      1. 现在第二个案例X > P_1+P_2+...+P_n。显然,即使我们将所有权重放在第二个等级上,我们也无法平衡。
      2. 这样就完成了证明并显示了何时可能以及如何将权重放置到两个比例以均衡它们的方式。

        修改

        我刚刚在SPOJ上提交的

        C++代码https://ideone.com/tbB7Ve

答案 1 :(得分:0)

解决这个问题非常简单。这个想法与@ Yerken的答案相同,但表达方式有点不同:

  • 只有第一个砝码的质量不能被3整除。所以第一个砝码是唯一一个对平衡{2} {mod 3属性有影响的砝码:
    • 如果X mod 3 == 0,则不得使用第一个重量
    • 如果X mod 3 == 1,则第一个重量必须是刻度B(当前为空)
    • 如果X mod 3 == 2,则第一个重量必须是按比例A
  • 按重量减去两个尺度(B) - &gt;解决方案没有改变,现在权重(A)可以被3整除,而权重(B)== 0
  • 设置X&#39; =权重(A)/ 3并将每个权重Pi除以3 ==&gt;解决方案没有改变,现在它与N&#39;同样的问题。 = N-1和X&#39; =(X + 1)/ 3

伪码:

listA <- empty
listB <- empty
for i = 1 to N {
  if (X == 0) break for loop; // done!
  if (X mod 3 == 1) then push i to listB;
  if (X mod 3 == 2) then push i to listA;
  X = (X + 1)/3;  // integer division
}
hasSolution <- (X == 0)

C ++代码:http://ideone.com/LXLGmE