庭师的利刃(2018江苏冬令营3 )
6358: 庭师的利刃
时间限制: 1 Sec 内存限制: 128 MB提交: 592 解决: 164
[提交] [状态] [讨论版] [命题人:admin]
题目描述
作为白玉楼的庭师,妖梦虽然不会n刀流,但是却领悟了生命二刀流。然而我也是个剑的收藏者,家里屯着n把剑,每一把剑都有一个灵魂值a[i],由于一些剑之间可能有共鸣,所以我需要两把契合度最高的剑。据妖梦所说,两把编号为i,j剑的契合度为a[i] and a[j]。如何深得剑的灵魂呢?(即求最大值)
输入
第一行一个整数n,代表藏剑数。
第二行n个整数,第i个整数表示a[i]。
第二行n个整数,第i个整数表示a[i]。
输出
输出包含一个正整数,最好的两把剑的契合度。
样例输入
5
12 5 6 3 1
样例输出
4
提示
对于40%的数据 n ≤ 1,000
对于100%的数据 n ≤ 1,000,000,0 ≤ a[i] < 2^31
来源/分类
题解:从高位到低位枚举,保证前面最大的同时,让后面尽可能大,(ans&a[j]) == ans) 该语句保证前面最大, (a[j]&dig) == dig 该语句保证让后面尽可能大,若有两个,就更新ans
code:
#include <bits/stdc++.h> using namespace std; typedef long long ll; const int N = 1e6+10; ll a[N]; int n; void solve() { ll ans = 0; for(int i = 30;i >= 0;i--) { int cont = 0; ll dig = 1ll<<i; for(int j = 1;j <= n;j++) { if(((ans&a[j]) == ans) && ((a[j]&dig) == dig)) cont++; if(cont >= 2) break; } if(cont >= 2) ans += dig; } printf("%lld\n",ans); } int main() { scanf("%d",&n); for(int i = 1;i <= n;i++) scanf("%lld",a+i); solve(); return 0; }