CF#769 Strange Test
题面

题目大意
给你两个整数a和b,(1<=a<b<=10^6)。每次可以执行以下三个操作之一,使得a等于b。求最小操作次数。
每次可以执行的三个操作为:
-
a=a+1
-
b=b+1
-
解题思路
注意到在执行操作3之后,a一定会大于等于b,那么之后要么a等于b,操作结束,要么只能执行操作2,令b=b+1直至b等于a。所以在执行了操作3之后,就只能执行操作2了。于是操作3在整个过程中只能执行一次。
假设我们在执行操作三之前经过若干次操作1和操作2,a和b分别变成了x和y,那么跟据前面的分析,总操作次数就是 (x-a)+(y-b)+1+(x|y)-y=x+(x|y)+(1-a-b).最后一项是常数,只需最小化x+(x|y).其中x一定小于等于b,因为x=b时候表示只执行b-a操作1使a=b,x>b时是的方案一定不是最优的。
那么我们可以将x从a到b进行迭代,求最小的x+(x|y)。任一给定的x,我们可以通过以下方法构造y。将x,b都写成2进制数,从高位到低位遍历b的二进制位。
-
若b当前二进制位是1,x对应的二进制位是1,设y对应的二进制位为1
-
若b当前二进制位是1,x对应的二进制位是0,设y对应的二进制位为1
-
若b当前二进制位是0,x对应的二进制位是0,y设y对应的二进制位为0
-
若b当前二进制位是0,x对应的二进制位是1,设y对应的二进制位为1,结束,跳出循环
代码
浙公网安备 33010602011771号