http://www.spoj.com/problems/SCALE/ 我试图使用递归但是获得TLE。 问题的标签说BINARY SEARCH。 如何使用二分搜索来做到这一点? 提前完成。
答案 0 :(得分:0)
首先要注意的是,如果你有每个大小的两个权重而不是一个,那么问题就会非常简单,因为我们只需要代表X
在其基础3
表示中并采用相应数量的权重。例如,如果X=21
,那么我们可以两次P_3
和一次P_2
,并将它们放到另一个范围内。
现在让我们尝试使用添加到两个比例(包括放置X
的那个)的事实来做类似的事情:
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
。 (*)这意味着,如果我们将某些权重从
1
添加到n-1
到与X
相同的比例,那么在那个规模上仍然 在2
- 最右边的数字(0或1)中没有n
。
从现在开始假设digit
表示base-3
表示中的数字的数字(但它可以暂时大于2:P)。现在,我们将第一个比例(放置X
的位置)的总权重表示为A=X
,另一个比例为B=0
,我们的目标是使它们相等(A
B
会随着我们的进步而改变。
让我们遍历A
的所有数字,从最小到最大(最左边)。如果当前数字索引是i
且它:
0
然后忽略并继续进行1
,然后我们将重量P_i=3^(i-1)
放在比例B
上。 2
,然后我们将P_i=3^(i-1)
添加到比例A
。请注意,这会导致数字(i+1)
增加。3
(是的,这种情况是可能的,如果当前和前一个数字都是2
)将1
添加到索引i+1
的数字并进一步(不是权重被添加到任何比例)。 由于(*)
显然程序将正确运行(因为最后一位数将等于1
中的A
),因为我们将从集合和地点中仅选择一个权重它们是正确的,显然,在程序完成后,数字A
和B
将相等。
X > P_1+P_2+...+P_n
。显然,即使我们将所有权重放在第二个等级上,我们也无法平衡。 这样就完成了证明并显示了何时可能以及如何将权重放置到两个比例以均衡它们的方式。
修改强>:
我刚刚在SPOJ上提交的答案 1 :(得分:0)
解决这个问题非常简单。这个想法与@ Yerken的答案相同,但表达方式有点不同:
mod 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