传送门
很小清新的思维题。
题意:很简单了,不再赘述。
做法:
首先对于一行的非常好做,我们直接考虑第 \(i\) 个位置一定匹配到第 \(i\) 个硬币,直接计算答案即可,设硬币的前缀和为 \(s_i\),则答案为 \(\sum\limits_{i=1}^n |i-s_i|\),意义为考虑当前这个点需要被经过多少次。
注意到一个事情,我们显然可以让所有棋子先上下移动再在内部左右移动。
那么现在是两行又该怎么做,一种想法是 dp,我们考虑 \(dp_{i,j}\) 代表考虑到了第 \(i\) 列,并且目前第二行放了 \(j\) 个的最小代价,直接考虑第 \(i\) 列放了多少个可以做到 \(O(n^3)\),但是显然硬币数这么小,我们考虑把 \(dp\) 改为枚举每个硬币就可以做到 \(O(n^2)\)。
注意到转移形似一个加一个绝对值函数然后取 min 的状物,可能可以通过线段树等方法优化 dp。
但是其实有更美妙的想法。
我们先进行转化,将所有位置减去 \(1\),那么答案就是 \(\sum |s_i|\)
我们考虑对上下两行同时记录前缀和,如果上下两个的前缀和异号,那么我们就令硬币上下移动到他们同号,贪心即可。
考虑为什么是对的,因为你正常在行内部移动时,你对答案的贡献最多为 \(1\),而将异号的往内缩有 \(2\) 的贡献,所以这样一定时更优的。
代码非常好写,复杂度 \(O(n)\)。
