1. 程式人生 > >hdu 5969 最大的位或(貪心)

hdu 5969 最大的位或(貪心)

對於一個l和r

我們都看成2進位制

最優情況一定是1000和0111來異或這樣就能得到在位數不可能改變的情況下能夠得到的最大值,

那麼如果l到r能夠存在這種情況就這麼異或

但如果l和r的位數相同,那麼就保留前面相同位數上的0和1,一旦遇到不同則按照以上方法對低位取xxxxx1000和xxxxx0111異或

#include<bits/stdc++.h>
using namespace std;
int main(){
	int t;
	unsigned long long er[77];
	er[0]=1;
	for(int i=1;i<=63;i++)
	{
		er[i]=er[i-1]*2;
	}
	cin>>t;
	while(t--)
	{
		unsigned long long l,r;
		cin>>l>>r;
		int lz[77];
		int lr[77];
		int js=0;
		while(l)
		{
			lz[js++]=l%2;
			l/=2;
		}
		int js1=0;
		while(r)
		{
			lr[js1++]=r%2;
			r/=2;
		}
		if(js1!=js)
		{
		unsigned 	long long ans;
			ans=er[js1]-1;
			cout<<ans<<endl;
		}
		else 
		{
			unsigned long long ans=0;
			for(int i=js-1;i>=0;i--)
			{
				if(lz[i]==lr[i])
				{
					if(lz[i]==1)
					ans=ans+er[i];
				}
				else{
					unsigned long long tt=er[i+1]-1;
					ans=ans+tt;
					break;
				}
			}
			cout<<ans<<endl;
		}
	}
	return 0;
}