1、 、 “与”运算 ( and ,1s, 64 MB )

题目描述:

给你一个长度为 n 的序列 A,请你求出一对 Ai,Aj(1<=i<j<=n)使 Ai“与”Aj 最大。
Ps:“与”表示位运算 and,在 c++中表示为&。

输入描述:

第一行为 n;
接下来 n 行,一行一个数字表示 Ai。

输出描述:

输出最大的 Ai“与”Aj 的结果。

样例输入:

3
8
10
2

样例输出:

8

样例解释:

8 and 10 = 8
8 and 2 = 0
10 and 2 = 2

数据范围:

20%的数据保证 n<=5000;
100%的数据保证 n<=3*10
5 ,0<=Ai<=10 9 。


思想

贪心
//位运算最高30位
#include<bits/stdc++.h>
using namespace std;
int n,pd;
int a[300005];
bool  lxl(int a,int b) {
	return (a&(1<<pd))>((b&(1<<pd)));
}
int main() {
	freopen("and.in","r",stdin);
	freopen("and.out","w",stdout);
	cin>>n;
	for(int i=1; i<=n; i++)
		scanf("%d",&a[i]);
	for(int i=30; i>=0; i--) {
		int all=0;
		pd=i;
		for(int j=1; j<=n; j++)
			if(a[j]&(1<<i))
				all++;
		if(all>=2) {
			sort(a+1,a+n+1,lxl);
			n=all;
		}
	}
	cout<<(a[1]&a[2])<<endl;
	return 0;
}