1、 、 “与”运算 ( and ,1s, 64 MB )
Ps:“与”表示位运算 and,在 c++中表示为&。
接下来 n 行,一行一个数字表示 Ai。
8
10
2
8 and 2 = 0
10 and 2 = 2
100%的数据保证 n<=3*10
题目描述:
给你一个长度为 n 的序列 A,请你求出一对 Ai,Aj(1<=i<j<=n)使 Ai“与”Aj 最大。Ps:“与”表示位运算 and,在 c++中表示为&。
输入描述:
第一行为 n;接下来 n 行,一行一个数字表示 Ai。
输出描述:
输出最大的 Ai“与”Aj 的结果。样例输入:
38
10
2
样例输出:
8样例解释:
8 and 10 = 88 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;
} 
京公网安备 11010502036488号