3 solutions
-
0
#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
#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
#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