3 solutions

  • 0
    @ 2025-10-5 14:34:15
    #include<bits/stdc++.h>
    using namespace std;
    int n,maxn=-1;
    int a[1000010];
    bool cmp(int x,int y){return x>y;}
    int main(){
    	cin>>n;
    	for(int i=1;i<=n;i++)cin>>a[i];
    	sort(a+1,a+n+1,cmp);
    	n=min(n,32);
    	for(int i=1;i<n;i++)for(int j=i+1;j<=n;j++)maxn=max(maxn,a[i]&a[j]);
    	cout<<maxn;
    	return 0;
    }
    
    • 0
      @ 2025-7-14 20:10:56
      #include <bits/stdc++.h>
      using namespace std;
      long long n,a[1000005];
      int main(){
          cin>>n;
          for(int i=1;i<=n;i++){
              cin>>a[i];
          }
          sort(a+1,a+n+1,greater<int>());
          long long maxx=0;
          long long n1=n>32 ? 32:n;
          for(int i=1;i<=n1;i++){
              for(int j=1;j<=n1;j++){
                  if(i!=j){
                      maxx=max(maxx,a[i]&a[j]);
                  }
              }
          }
          cout<<maxx;
          return 0;
      }
      
      • 0
        @ 2025-7-13 15:50:51
        
        #include<cstdio>       // 标准输入输出库(用于scanf/printf)
        #include<iostream>     // I/O流库(实际未使用,可省略)
        #include<algorithm>    // 算法库(用于swap函数)
        #include<cstdlib>      // 通用工具库(实际未使用)
        #include<cstring>      // 字符串处理库(实际未使用)
        using namespace std;
        
        const int MAX_N = int(1e6) + 100;  // 定义最大数组大小(100万+100的缓冲区)[[12, 18]]
        
        int a[MAX_N];  // 全局数组,存储所有食材的美味度
        
        // 自定义排序函数:按二进制第k位分割数组
        // 目标:将第k位为1的元素移到左侧,为0的元素移到右侧
        // 返回值:第k位为1的子数组的右边界下标
        int sort(int l, int r, int k) {
            while(l <= r) {
                // 从左向右找到第一个第k位为0的元素
                while ((l <= r) && (a[l] >> k & 1)) l++;  // >>k&1 取第k位值[[2, 4]]
                // 从右向左找到第一个第k位为1的元素
                while ((l <= r) && (!(a[r] >> k & 1))) r--;
                // 交换这两个元素,使1集中在左,0集中在右
                if (l <= r) swap(a[l++], a[r--]);  // 交换后移动指针
            }
            return r;  // 返回分割点(左侧区域的右边界)
        }
        
        int main() {
            int n, j, ans = 0;  // j: 临时变量; ans: 存储最终契合度
            
            // 输入处理
            scanf("%d", &n);  // 读取食材数量
            for (int i = 1; i <= n; i++) scanf("%d", &a[i]);  // 读取美味度[[6, 12]]
            
            // 核心算法:从高位到低位贪心处理
            for (int i = 31; i >= 0; i--) {  // 遍历32位(int范围)
                // 按第i位分割数组,j为分割点下标
                if ((j = sort(1, n, i)) >= 2) {  // 关键判断:若分割后左侧有≥2个元素
                    ans |= (1 << i);   // 将该位设为1(此位可贡献到最终结果)[[18, 20]]
                    n = j;             // 缩小范围:后续只处理左侧区域(第i位为1的食材)
                }
                // 若左侧不足2个元素,则跳过该位(无法构成有效组合)
            }
            
            printf("%d\n", ans);  // 输出最大契合度
            return 0;
        }
        
        • 1

        Information

        ID
        4946
        Time
        1000ms
        Memory
        512MiB
        Difficulty
        5
        Tags
        # Submissions
        35
        Accepted
        11
        Uploaded By