标签:贪心
A little girl loves problems on bitwise operations very much. Here‘s one of them.
You are given two integers l and r. Let‘s consider the values of for all pairs of integers a and b (l?≤?a?≤?b?≤?r). Your task is to find the maximum value among all considered ones.
Expression means applying bitwise excluding or operation to integers x and y. The given operation exists in all modern programming languages, for example, in languages C++ and Java it is represented as "^", in Pascal — as ?xor?.
The single line contains space-separated integers l and r (1?≤?l?≤?r?≤?1018).
Please, do not use the %lld specifier to read or write 64-bit integers in С++. It is preferred to use the cin, cout streams or the %I64d specifier.
In a single line print a single integer — the maximum value of for all pairs of integers a, b (l?≤?a?≤?b?≤?r).
1 2
3
8 16
31
1 1
0 题意: 在区间[l,r]中找出两个数a,b(a <= b),使得a ^ b达到最大; 题解:(1) 首先有这样一个现象,当2 ^ n <= r的n达到最大时,且2 ^ n - 1 >= l ,答案是(2 ^ n + 2 ^ n - 1),即其二进制数全部为一,且为异或的最大值,没法再大,因为2 ^ n已达到 极限; 另一种情况是当2^n < l 时就贪心处理. 从高位往低位枚举,对于当前为如果二进制数为1,比l还小的话,则置为1,如果当前值大于r的话,则置为0; 否则则后面的位符合 (1)说法; AC代码:#include <iostream> #include <cstdio> #include <cstring> #include <cmath> #include <bitset> #include <algorithm> #include <vector> #define lson l,mid,u << 1 #define rson mid + 1,r,u << 1 | 1 #define ls u << 1 #define rs u << 1 | 1 #define exp 1e-8 using namespace std; typedef long long ll; int main() { ll l,r; while(cin>>l>>r) { ll maxn = 0; if(l == r) { puts("0"); continue; } ll i = 0,ans; while(true) { ans = 1LL << i; if(ans > r) { ans = 1LL << (i - 1); break; } i++; } i--; if(ans >= l && ans - 1 >= l) { cout<<ans + ans - 1<<endl; } else { while(true) { ll res = ans + (1LL << (i - 1)); if(res <= l) ans += 1LL << (i - 1); else if(res <= r){ ans = 0; for(ll j = 0; j < i; j++) { ans += 1LL << j; } break; } i--; } cout<<ans<<endl; } } return 0; }
D. Little Girl and Maximum XOR(贪心)
标签:贪心
原文地址:http://blog.csdn.net/zsgg_acm/article/details/44967663