zoukankan      html  css  js  c++  java
  • 庭师的利刃(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;
    }
  • 相关阅读:
    PHP数字签名算法
    PHP日期相关类
    浏览器常见bug及解决办法
    PHPer整理的前端开发知识
    小程序之轮播图(2020.4.13更新)
    Android APK反编译 apktool使用教程
    秒懂-单列布局水平居中布局
    一句话搞定-phpStudy安装yaf扩展
    Git的简单安装
    人人都能读懂的css3 3d小demo
  • 原文地址:https://www.cnblogs.com/lemon-jade/p/9352903.html
Copyright © 2011-2022 走看看