CF2122B Pile Shuffling
题目传送门
题目大意
有
每次操作中,你可以取出任意堆的顶部元素,并将其移动到任意堆的任意位置(包括原堆)。
计算最少需要多少次操作,才能使第
思路
我们需要分别考虑
0 的数量
- 如果第
i 堆0 的初始数量大于0 的目标数量,即a_i > c_i ,那么现在要把多余的0 放到其他堆去,此时需要操作a_i - c_i 次。 - 如果第
i 堆0 的初始数量小于0 的目标数量,即a_i < c_i ,那么现在要从其它堆取0 放到第i 堆,此时需要操作c_i - a_i 次。
注意上述操作的操作次数需要除以
1 的数量
- 如果第
i 堆1 的初始数量大于1 的目标数量,即b_i > d_i ,那么现在要把多余的1 放到其他堆去,但是要先把上方的0 移到堆的中间,所以要先操作c_i 次(此时不需要除以2 ,因为这次操作发生在同一堆内,所以不会被重复计算),再操作b_i - d_i 次。 - 如果第
i 堆1 的初始数量小于1 的目标数量,即b_i < d_i ,那么现在只要从其它堆取1 放到第i 堆即可,此时需要操作d_i - b_i 次。
同理,上述操作的操作次数需要除以
关键代码
long long sum=0;
if(a>c) sum+=(a-c);
else if(a<c) sum+=(c-a);
if(b>d) sum+=(c*2) , sum+=(b-d);
else if(b<d) sum+=(d-b);
cout <<sum/2;