CF1632C Strange Test(抽象数学模型,位运算)

Strange Test

题解:
其中对于第 3 3 3 个操作,全程是只用了一次,因为用了第 3 3 3 次操作以后, a a a 的值只会变得比 b b b 只大不小,那么必然后面的最优操作只能是不断地执行第 2 2 2 种操作。
抽象个数学模型,其中 a a a 先不断进行第 1 1 1 种操作达到了 a ′ a^{'} a b b b 不断进行操作达到了 b ′ b^{'} b,所用的总操作数就是 a ′ − a + b ′ − b + ( a ′ ∣ b ′ ) − b ′ + 1 a^{'} - a + b^{'} - b + (a^{'} | b^{'}) - b^{'} + 1 aa+bb+(ab)b+1,整理得到 a ′ + ( a ′ ∣ b ′ ) + 1 − a − b a ^ {'} + (a ^ {'} | b ^ {'}) + 1 -a - b a+(ab)+1ab,其中 1 − a − b 1 -a -b 1ab 是常量,所以只需要优化前面
那么 a ′ a^{'} a a a a b b b 不断进行迭代,此时我们要使 ( a ′ ∣ b ′ ) (a ^ {'} | b ^ {'}) (ab) 最小,那么将 a ′ a^{'} a 从高位向低位进行考虑,到了比如说第 j j j 位了,其中 a ′ a^{'} a 此时第 j j j 位是 1 1 1,而 b b b 的第 j j j 位是 0 0 0,那么此时将 b ′ b^{'} b 的第 j j j 位置为 1 1 1,并跳出循环就是所要的,而对于其他的情况,都置为 b b b 以前在对应该位的值

要点:
发现第 3 3 3 种操作的特殊性
如何归纳数学模型
如何使得 ( a ′ ∣ b ′ ) (a^{'} | b^{'}) (ab) 达到最小值

code:

#include <bits/stdc++.h>
using namespace std;
#define db double
#define ll long long
#define pii pair<int,int>
#define mm(a,b) memset(a,b,sizeof(a))
#define rush() int T; cin >> T; while (T--)
#define ACCELERATE (ios::sync_with_stdio(false),cin.tie(0))
const int N = 2e5 + 5;
const int M = (N << 2);
const int P = 1e9 + 7;
const int inf = 0x3f3f3f3f;
const ll INF = 0x3f3f3f3f3f3f3f3f;
int a, b;
int main()
{
    ACCELERATE;
    rush() {
        cin >> a >> b;
        int ans = b - a;
        for (int i = a; i < b; i++) {
            int k = 0;
            for (int j = 20; j >= 0; j--) {
                if (((i >> j) & 1) == 1 && ((b >> j) & 1) == 0) {
                    k ^= (1 << j);
                    ans = min(ans, i + (i | k) + 1 - a - b);
                    break;
                }
                if ((b >> j) & 1) k ^= (1 << j);
            }
            if (k == b) ans = min(ans, i + (i | k) + 1 - a - b);
        }
        cout << ans << endl;
    }
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值