codeforces round 922 div2 (C题 xor-distance)

xor-distance 

这个题考察了异或运算和贪心策略,对位运算不熟悉的人可能会有些懵逼,比如我.

1,首先要想明白的一件事是,如果a,b某二进制位相同,那不管x这一位是0,还是1,最后这一位相减的结果都为0,无影响,所以从两个数第一个不同的位开始考虑即可,以此为最高位

2,第二,而如果a,b这一位不同,那么x为1的话会反转这一位相减的结果(即变成相反数).

所以如果最高位为正,则后面的结果尽可能为负即可,最高位为负,则后面的结果尽可能为正即可,这里说尽可能,是因为,x有范围限制

3,那么最高位是改还是不改呢,不改.

如果最高位可改,你改了,会导致后面可能无法改(因为x有范围限制),你不改,则后面每一位都改了都行(因为你连最高位都可以改了,后面的总和是不会超过最高位的),所以,不改操作空间大

如果最高位不可改,那就别想了,从后面寻找机会吧

所以干脆保留最高位的结果,尽可能把后面的结果改成最优

#include
using namespace std;
#define int long long
signed main()
{
    ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
    int t;
    cin>>t;
    while(t--)
    {
        int a,b,r;
        cin>>a>>b>>r;
        int now=0;
        bool is_high=1;
        for(int i=63;i>=0;i--)
        {
            bool px=(a&(1ll<=(1ll<0)
                {
                    r-=(1ll<

你可能感兴趣的:(算法,c++)