C:
贪心。每次选一个最小的满足条件的砝码即可,这样能留给后面更多的选择余地。
但是光是这样还有一点小问题。当时就因为只是这样随手一贪,导致最后挂了。。。
我们应该还要先枚举第一个砝码放谁,再开始贪心。
例如:
有砝码1,2,3,需要放4块。
单纯贪心的话,会这样选择:1,2,3,*。(*代表无法选择,终止了)
对于左边的天平有1+3=4 kg,右边有3 kg。
此时选砝码1,2,不能大于4,非法。选3,和前面重复,非法。
但其实我们可以2,3,2,3的放,是有解的。
所以要枚举第一块砝码,然后贪心。
code:
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
D:
线段树。
把相邻两个数合并,就相当于线段树把左子树和右子树合并。
每个节点存的是这段区间合成一个数后的值。然后再标记下该节点的两个子节点应该做什么运算。
至于每次修改值,就是单点更新了。
可以单独考虑二进制每一位。(写完发现根本不用单独考虑二进制位,直接算就好了,拙计了。。。)
code:
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
E:
每次找到最左(右)的错排位置,把相应的该放这个位置的数翻转回到这个位置。
若干次后必然能回到原始序列。但是题目要求最多操作3次,所以需要dfs搜出一个小于等于3次的答案。
至于复杂度,这样爆搜为什么不会TLE。
我拙计的分析下:
在原始序列上最多翻转3,能产生最左(右)的错排位置不多,假设有x个。
所以dfs的复杂度最坏O(nx^2^3)。
x显然不大,感觉是这样。。。
而且因为必然有3次以内的解,随便翻几次应该很多都在正确的位置了。
其实关键还是最多3次的限制降低了复杂度,大于3次的都剪掉了,小于等于3次的也不多。
以上分析,最好别看,因为完全是我自己猜的。。。
如果大神有严谨的分析,还望在楼下告诉弱菜。
code:
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include