CF1632C. Strange Test

46 篇文章 1 订阅
37 篇文章 0 订阅

Link
按位或运算,1600
不太会做,,题解也没看懂,自己写了个感觉错误的代码ac了但不知道为什么是正确的。。。自己做这些位运算的题完全随缘

题意

给出 a , b a, b a,b,每次操作可以进行如下三种之一:

  1. a = a + 1 a=a+1 a=a+1
  2. b = b + 1 b=b+1 b=b+1
  3. a = a ∣ b a=a|b a=ab,按位或

问最少进行多少次操作,可以使 a = b a=b a=b a , b ≤ 1 e 6 a,b\leq 1e6 a,b1e6

思路

首先第三种操作最多进行一次,因为如果进行了第三种操作,那么一定有 a ≥ b a\geq b ab,也就是之后仅能进行操作2。所以分成是否进行第三种操作考虑。
1.不进行第三种操作:显然 c n t = b − a cnt=b-a cnt=ba
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种操作吗。。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值