A:
贪心。考虑一般情况(即每个数都有小数)题目要求的值即是所有的小数部分之和-n,但是由于有整数的存在,整数可以向上取整,也可以向下取整,因此若有x个整数,则有x个可选择的'1',借此来调整answer使其绝对值最小。
B:
显然跟逆序对有关,每次交换要么逆序对加1,要么减1。设 dp[i] 为逆序对数为i时的期望,则 dp[i] = dp[i-2]*0.5 + dp[i]*0.5 + 2,化简得 dp[i] = dp[i-2] + 4。边界 dp[0] = 0,dp[1] = 1。
C:
存在一组最优解,从0~任意位置的平衡不超过n(即左括号数量不大于右括号数量+n)。任意位置平衡不大于2*n是容易证明的,但是对于前面更强的结论表示不会证,但是这不妨碍正确性。
那么简单起见,假设平衡不超过x,则我们只需要求出从平衡a通过一段n序列转移到平衡b的代价,即是一个 x*x的矩阵T,求出T^m,(0,0) 即是answer。
D:
分块。题目给定的操作中,最后一步是将序列重排,那么显然可以在一步操作之后,通过将相同的数连续放置,来构造出只需要数种类数步数的方案,这个方案显然是最优的。主要需要处理的是第一步的选择,最好当然是第一步能消掉一种数,这样答案就是区间中数的种类数,否则答案是数的种类数+1。因此需要知道区间里存不存在一种数,它在区间里的所有下标能构成等差数列。为每一种数维护一个双端队列,该种数能构成等差序列当且仅当队列中相邻两数的差值只有1种,也就是相邻三个数的构成的两根线段长度相等,借此可判断该数能不能构成等差数列。设当前区间为 [l,r],转移到 [l,r+1] 时,就在 a[r+1] 对应的deque尾部插入 r+1,并且判断deque[a[r+1]]的等差性质是否改变,其他转移同理,注意细节。用分块实现。
E:
先对所有数取绝对值。对于当前最大的数x,显然小于x的数的决策都不影响他们与x的相对关系。那么先假设所有数都不相等,从大到小开始考虑:当x取正时,x 与右边比它小的数构成逆序对,当x取负时,x 与左边比它小的数构成逆序对,这个贪心就可以了。由于题目中存在相等的数,并且这些相等的数的决策是相互影响的,那么可以dp一下,设状态为前i个数,有j个选正号,下的最小逆序对数。于是题目的解法就很清晰了:从大到小决策,对相等的数dp求解。