当前位置:首页 > GESP > 2023年GESP五级烹饪问题解题指南:位运算优化AND最大值求解

2023年GESP五级烹饪问题解题指南:位运算优化AND最大值求解

2个月前 (07-17)

2023年GESP五级烹饪问题解题指南:位运算优化AND最大值求解 GESP五级 位运算 洛谷 GESP C++ 异或运算 第1张

一、题目解读

2023年GESP五级编程竞赛中的“烹饪问题”(对应洛谷B3930)要求从给定的整数数组中寻找一个元素,使其与数组中其他任意元素的按位与(AND)结果最大。题目需在保证结果尽可能大的同时,确保该元素本身存在于原数组中。这一问题的关键在于高效遍历与筛选符合条件的元素,避免暴力枚举带来的超时风险。

二、解题思路

采用位运算优化策略,核心思想是从高位到低位逐位构建目标元素,而非直接遍历数组元素。通过预设位掩码(mask)和临时结果(temp),每次尝试将当前位(从第30位开始)加入目标元素,并统计数组中满足“与操作后等于temp”的数值个数。若存在至少两个元素符合,则保留该位;否则撤销,确保最终结果既满足条件又是最大可能的AND值。

三、解题步骤

1. 初始化:设置位掩码mask=0,初始最大值max_and=0,从最高位(第30位)开始检查。

2. 逐位尝试:

    将当前位i加入mask(mask |= (1 << i))。

    构建临时目标值temp(max_and | (1 << i))。

    遍历数组,统计满足(num & mask) == temp的元素个数count。

    若count≥2,则保留该位(更新max_and = temp);否则撤销该位(mask ^= (1 << i))。

3. 返回结果:最终max_and即为符合条件且最大的AND值。

四、代码与注释

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

// 寻找数组中元素的最大AND值
int findMaxAnd(vector<int>& nums) {
    int mask = 0;          // 位掩码,用于构建目标值
    int max_and = 0;       // 当前最大AND值

    // 从最高位开始检查(30位对应int类型最大二进制位)
    for (int i = 30; i >= 0; i--) {
        // 尝试设置这一位
        mask |= (1 << i);          // 将第i位设为1
        int count = 0;
        int temp = max_and | (1 << i); // 临时目标值(当前位加入max_and)

        // 统计有多少数字包含当前构建的模式
        for (int num : nums) {
            if ((num & mask) == temp) { // 若num与mask的与结果等于temp
                count++;
                if (count >= 2) break; // 若找到≥2个,无需继续遍历
            }
        }

        // 如果有至少两个数字满足,保留这一位
        if (count >= 2) {
            max_and = temp;
        } else {
            mask ^= (1 << i); // 撤销这一位(异或操作清除第i位)
        }
    }

    return max_and;
}

int main() {
    int N;
    cin >> N;          // 输入数组长度
    vector<int> a(N);
    for (int i = 0; i < N; i++) {
        cin >> a[i];    // 读入数组元素
    }

    cout << findMaxAnd(a) << endl; // 输出结果
    return 0;
}

五、总结

本解法巧妙利用位运算特性,将“寻找最大AND值”转化为逐位决策问题,通过动态构建位掩码实现高效筛选。相比暴力枚举所有元素组合,该算法通过“提前终止无效位检查”和“计数满足条件元素”两大优化,大幅降低时间复杂度。这一思路对处理位操作相关的优化问题具有重要参考价值,尤其在编程竞赛中可显著提升解题效率。

参考:2023年GESP五级烹饪问题

原创内容 转载请注明出处

分享给朋友:

相关文章

征服力扣704题:三步掌握经典二分查找算法

征服力扣704题:三步掌握经典二分查找算法

题目重解我们面对的是算法领域最经典的二分查找问题:在一个已排序的整数数组中,快速定位目标值的位置。就像在一本按字母顺序排列的字典中查找单词,我们不需要逐页翻阅,而是通过不断折半的方式快速缩小搜索范围,...

2024 GESP五级「奇妙数字」深度解析:高效解题代码与数学逻辑揭秘(洛谷B4070)

2024 GESP五级「奇妙数字」深度解析:高效解题代码与数学逻辑揭秘(洛谷B4070)

一、题目解读2024年GESP(青少年编程能力等级测试)五级题目「奇妙数字」(对应洛谷平台题目B4070),要求选手根据特定规则计算输入数字的“奇妙值”。题目核心在于挖掘数字的数学特性,结合质因数分解...

2025年GESP七级等价消除(洛谷P11965)代码解析与优化策略

2025年GESP七级等价消除(洛谷P11965)代码解析与优化策略

一、题目解读    2025年GESP七级考试中的“等价消除(洛谷P11965)”问题要求统计给定字符串中满足等价条件的子串数量。所谓“等价子串”,是指子串中所...

【CSP-S 2019】括号树(洛谷P5658)解题报告:栈+DFS+异或优化详解

【CSP-S 2019】括号树(洛谷P5658)解题报告:栈+DFS+异或优化详解

一、题目解读括号树问题(洛谷P5658)要求处理一个由括号序列转化的树结构:每个节点表示一个括号,'('为子节点,')'为父节点。题目给定一棵n个节点的树,需计算每个节...

标题:洛谷B3617题解析:八进制转十六进制算法实现与优化(附AC100代码)

标题:洛谷B3617题解析:八进制转十六进制算法实现与优化(附AC100代码)

一、题目解读洛谷B3617题要求将输入的八进制字符串转换为十六进制表示。题目需处理大数场景,且对输入合法性有明确限制(长度不超过1000,仅包含0-7字符)。由于八进制与十六进制无法直接转换,需借助十...

2024年GESP四级宝箱题(洛谷P4006)题解:滑动窗口算法优化最长子序列和

2024年GESP四级宝箱题(洛谷P4006)题解:滑动窗口算法优化最长子序列和

一、题目解读本题为2024年GESP四级中的“宝箱”问题(对应洛谷P4006),要求在一个由n个宝箱组成的序列中,找出一个连续子序列,使得该子序列中宝箱价值之和最大,且子序列中最大值与最小值的差不超过...

发表评论

访客

看不清,换一张

◎欢迎参与讨论,请在这里发表您的看法和观点。