题目背景

对应的选择、判断题:https://ti.luogu.com.cn/problemset/1137

题目描述

有 N 种食材,编号从 1 至 N,其中第 i 种食材的美味度为 ai​。

不同食材之间的组合可能产生奇妙的化学反应。具体来说,如果两种食材的美味度分别为 x 和 y ,那么它们的契合度为 x and y。

其中,and 运算为按位与运算,需要先将两个运算数转换为二进制,然后在高位补足 ,再逐位进行与运算。例如,12 与 6 的二进制表示分别为 1100 和 0110 ,将它们逐位进行与运算,得到 0100 ,转换为十进制得到 4,因此 12 and 6=4。在 C++ 或 Python 中,可以直接使用 & 运算符表示与运算。

现在,请你找到契合度最高的两种食材,并输出它们的契合度。

输入格式

第一行一个整数 N,表示食材的种数。

接下来一行 N 个用空格隔开的整数,依次为 a1​,⋯,aN​,表示各种食材的美味度。

输出格式

输出一行一个整数,表示最高的契合度。

输入输出样例

输入 #1复制

3
1 2 3

输出 #1复制

2

输入 #2复制

5
5 6 2 10 13

输出 #2复制

8

说明/提示

样例解释 1

可以编号为 2,3 的食材之间的契合度为 2 and 3=2,是所有食材两两之间最高的契合度。

样例解释 2

可以编号为 4,5 的食材之间的契合度为 10 and 13=8,是所有食材两两之间最高的契合度。

数据范围

对于 40% 的测试点,保证 N≤1,000;

对于所有测试点,保证 N≤106,0≤ai​≤2,147,483,647。

代码实现:

#include <iostream>
#include <vector>
using namespace std;

int main()
{
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    int n;
    cin >> n;
    vector<int> a(n);
    for (int i = 0; i < n; ++i)
        cin >> a[i];

    int ans = 0;
    for (int bit = 30; bit >= 0; --bit)
    {
        int mask = ans | (1 << bit);
        vector<int> buf;
        for (int x : a)
        {
            if ((x & mask) == mask)
            {
                buf.push_back(x);
                if (buf.size() >= 2) break;
            }
        }
        if (buf.size() >= 2)
            ans = mask;
    }
    cout << ans << '\n';
    return 0;
}

Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐