Link
按位或运算,1600
不太会做,,题解也没看懂,自己写了个感觉错误的代码ac了但不知道为什么是正确的。。。自己做这些位运算的题完全随缘
题意
给出 a , b a, b a,b,每次操作可以进行如下三种之一:
- a = a + 1 a=a+1 a=a+1
- b = b + 1 b=b+1 b=b+1
- a = a ∣ b a=a|b a=a∣b,按位或
问最少进行多少次操作,可以使 a = b a=b a=b, a , b ≤ 1 e 6 a,b\leq 1e6 a,b≤1e6
思路
首先第三种操作最多进行一次,因为如果进行了第三种操作,那么一定有
a
≥
b
a\geq b
a≥b,也就是之后仅能进行操作2。所以分成是否进行第三种操作考虑。
1.不进行第三种操作:显然
c
n
t
=
b
−
a
cnt=b-a
cnt=b−a
2.进行一次第三种操作
void solve() {
int a, b;
cin >> a >> b;
if((b|a) == b) { //如样例a=1,b=3,直接得到
cout << 1 << endl;
return;
}
int cnt = b - a;
for(int i = 1; i < cnt; i++) {
if(((a+i)|b)==b||((b+i)|a)==b+i) {
cnt = i + 1;
break;
}
}
cout << cnt << endl;
}
不知道为什么是对的。。分为进行了
i
i
i 次操作1,一次操作3或
i
i
i 次操作2,一次操作3。
这样难道不是没有进行过全部的3种操作吗。。