☰
2025年秋招-美团-技术岗-第二批笔试 11.组数制进二
2026/10/21 1:48:56 网站建设 项目流程

补充题意解读: X 的每一个二进制位上的 1,最多可以给数组里某一个数字的对应二进制位补一个 1。如果数组全部 n 个数字的某一二进制位已经全部是 1,这个位置就无法再做填充,X 该位必须置 0;只要数组存在至少一个数字该二进制位为 0,X 就可以把这一位置 1,以此获得总和增益。

解题思路

本题属于位运算 + 贪心题型,核心思想:按二进制位从低位到高位统计,判断每一个二进制位是否还有提升空间。

  1. 统计数组每一个二进制位上 1 出现的总次数,存入数组v[],v[i]代表数组第i位二进制为 1 的元素个数。
  2. 对于第 i 位:
    • 如果v[i] < n:说明数组中至少有一个数字的第i位是 0,X 可以把该位设置为 1,带来 \(2^i\) 的总和增益;
    • 如果v[i] == n:数组全部数字该位已经是 1,无法再填充,X 该位置 0。
  3. 将所有可以开启的二进制位组合,得到 X。最终最大总和 = 原数组总和 + X。

关键点:X 每一位只要有机会就置 1,因为每一位的增益互相独立,贪心选择全部可填充的二进制位,即可得到全局最优解。

#include <bits/stdc++.h> using namespace std; int main() { int t,n,i,j,a; cin>>t; while(t--) { long long sum=0; int v[35]={0},x=0; cin>>n; for(i=1;i<=n;i++) { cin>>a; sum+=a;/**< 读数据,统计综合 */ j=0; while(a)/**< V数组统计数字二进制的1的个数 */ { v[j]+=a%2; j++; a/=2; } } i=32; while(v[i]==0) i--;/**< 找到最高位i */ for(;i>=0;i--) if(v[i]<n)/**< 第i为不全都是1,X中这一位二进制置为1 */ x+=(1<<i);/**< 加入X */ cout<<sum+x<<' '<<x<<endl; } return 0; }

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询