庭师的利刃(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]。

输出

输出包含一个正整数,最好的两把剑的契合度。

样例输入

5
12 5 6 3 1

样例输出

4

提示

对于40%的数据 n ≤ 1,000
对于100%的数据 n ≤ 1,000,000,0 ≤ a[i] < 2^31

来源/分类

2018江苏冬令营3 

题解:从高位到低位枚举,保证前面最大的同时,让后面尽可能大,(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
",ans);
}
int main()
{
    scanf("%d",&n);
    for(int i = 1;i <= n;i++)   scanf("%lld",a+i);
    solve();
    return 0;
}
原文地址:https://www.cnblogs.com/lemon-jade/p/9352903.html