A. Knapsack
猜结论:给所有的物品按重量降序排序。然后枚举物品,如果拿了这个物品后会超重,那么就不拿。否则就拿。
如果拿了一个物品后,重量符合了条件,就返回输出答案。
B. Catching Cheaters
观察1:如果为了使LCS增加1,而多用超过2个字符,这样其实是亏本的。
观察2:如果使用正好2个字符,这样其实不赚。
根据观察,就可以有一个(O(n^2))动态规划的方法。大概就是(dp{i, j})可以只从(dp_{i - 1, j}),(dp_{i, j - 1})和(dp_{i-1,j-1})转移得到。
我比赛的时候只用了观察1写,多写了好多转移,浪费了很多时间,其实可以结合观察2再简化。
C. Xor Tree
将所有元素都插入01字典树,高位靠近树根。这个时候有:同一颗子树内的两个叶子节点异或值会更小。
所以,如果一个节点的左子树和右子树都包含超过1个节点,那么左子树和右子树里的点就会内部消化,形成两棵树。
反之,就只会形成1棵树。
所以,当存在上述节点时,贪心地把包含点数少的子树删成只有一个节点,这样就可以使最后保留的节点尽可能地多。