来自https://open.kattis.com/problems/numbertree的问题,来自2014年KTH挑战
This is how the number tree looks like
我使用了for循环来遍历由“ L”和“ R”组成的输入字符串,并使用curr来存储要评估的当前变量,并在此迭代之前先存储该变量。
if (i == 0) { //first 'L' or 'R'
if (curr == 'L') { count++; }
if (curr == 'R') { count +=2 ; }
}
在这里,如果当前字符与前一个字符相同,则我将count增加2到通过的循环次数,如果当前字符与前一个字符不同,则将其减去1。
else if (curr == prev) { count += (int) Math.pow(2, h); }
else if (curr != prev) { count += (int) Math.pow(2, h)-1;
在每个循环结束时,我将prev等同于curr并增加h。
此逻辑适用于三个给定的输入3 LR
,3 RRL
和2
,它们返回11
,2
和{{1} }。
但是它没有通过隐藏的测试用例。我尝试过的一种输入是7
应该返回3 LLL
,但是我的算法返回8
。 3
应该返回5,但我得到3。
是否存在一个使用数据结构来获取解决方案的解决方案,因为该问题引用了“完美的二叉树”。感谢您在解决我的逻辑以及其他解决方案方面的任何帮助。谢谢!
答案 0 :(得分:0)
作为完美的二叉树,级别x的最低节点大于2 ^ k的总和,其中k是从级别x + 1到H的节点数。路径5 RL告诉您您在5级树上的2级中有一个节点,因此该节点大于2 ^ 3 + 2 ^ 4 + 2 ^ 5 =56。现在我们将树简化为H = h(x),可以观察到节点的路径不过是二进制代码,其中L = 0,R = 1。我们将此二进制代码转换为整数,将其求和为之前获得的数字,然后得到节点的标签。路径RL为10 = 2,然后5 RL具有标签58。
现在,转换此算法非常简单,因为您只需将数组分成两部分,以二进制代码转换R-L路径并进行数学运算即可。