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; }