小总结:快速幂+贪心————Bit Mask____UVA 10718 多多去理解去温习哦!
传送门:https://vjudge.net/problem/UVA-10718
Preview:
bitstream:a flow of data in binary form.
in bit-wise expression:用位表示。
Her face was a cold blank mask. 她装出一副冰冷冷毫无表情的样子。
perform a bit-wise AND operation.
In bit-wise expression, mask is a common term.
输入3个数 n,l,u,问你能否找出一个数m,在满足 l <= m <= u的情况下。使得m|n最大,如果有多个数都能使得m|n最大,那么输出最小的那个数。
分析:
这题用贪心来写。。我们知道或操作。只要有1进行或操作后会变成1。。
所以在进行贪心的时候。我们只要考虑n为1的位置尽量用0去填,n为0的位置尽量用1去填。
不过在这之前要进行一个判断。就是如果当前一位如果填上1,会超过上界r,则只能填0.如果当前一位填上了0,会使得即使后面每位都填上1也到不了下界l,则只能填1.
然后由于n最大为2^32。。本来想用位运算的结果悲剧了。。最后自己写了个快速幂去把一个数拆解成01的二进制数。
#include<bits/stdc++.h> using namespace std; typedef long long ll; ll n,l,r; int vis[33]; ll num; ll mi(ll a,ll b) //快速幂 { ll ans=1; while(b) { if(b&1) ans=(ans*a); b>>=1; a=(a*a); } return ans; } int main() { while(~scanf("%lld%lld%lld",&n,&l,&r)) { for(int i=31;i>=0;i--) { if(n>=mi(2,i)) { n-=mi(2,i); vis[i]=1; } else vis[i]=0; } num=0; for(int i=31;i>=0;i--) { if(mi(2,i)+num>r) continue; //如果填1超过上界 else if(mi(2,i)-1+num<l) //如果填0到不了下界 num+=mi(2,i); else { if(!vis[i]) //0的位置填1 num+=mi(2,i); } } printf("%lld\n",num); } return 0; }
Resorce:
https://blog.csdn.net/accelerator_/article/details/10031579