Codeforces Round #683 (Div. 1, by Meet IT)/Codeforces1446 ABC

AC代码

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棵树。

所以,当存在上述节点时,贪心地把包含点数少的子树删成只有一个节点,这样就可以使最后保留的节点尽可能地多。

posted @ 2020-11-16 01:34  _Backl1ght  阅读(194)  评论(0编辑  收藏  举报