1 条题解
-
0
假如当前位上存在两个元素可以 & 运算获得 1,我们可以将所有取值为 1 的元素保留下来,而取值为 0 的元素无论怎么运算都是 0,直接删除;假如当前位任何元素 & 运算都不能得到 0,我们就忽略这位,继续观察下一位。直到剩下两个元素,那么这两个元素 & 运算肯定是最大的。
#include <iostream> #include <vector> using namespace std; vector<vector<int>> readGroups(int groups) { vector<vector<int>> result; while (groups--) { int n; cin >> n; vector<int> group(n); for (int i = 0; i < n; ++i) { cin >> group[i]; } result.push_back(group); } return result; } int testhardness(vector<int> group) { int highest_hardness = 0; int length = group.size(); for (int i = 0; i < length; ++i) { for (int j = 0; j < length; ++j) { if (i != j) { int hardness = group[i] & group[j]; // 计算两个数字的按位与 if (hardness > highest_hardness) { highest_hardness = hardness; } } } } return highest_hardness; } unsigned Max(vector<int> array){ int len = array.size(); int maxBit = sizeof(unsigned) * 8; // 最高位数 unsigned currBit = 1; // 当前位 int mark[len]; // 标记被剔除元素的数组,下标对应相应的元素 int result = 0; for (int i = 0; i < len; i++) mark[i] = 1; // 第i个元素为1,表示保留 currBit = currBit << (maxBit-1); for (int i = 0; i < maxBit; i++){ // 统计 int count = 0; for(int j = 0; j < len; j++){ if(mark[j] == 1 && (array[j] & currBit) != 0) count++; } if (count > 1){ // 剔除 for(int j = 0; j < len; j++){ if ((array[j] & currBit) == 0) mark[j]=0; // 标记数组置为0表示剔除 } // 更新结果,如 0100 + 0010 = 0110 result += currBit; } // 下一位 currBit = currBit >> 1; } return result; } int main() { int groups; cin >> groups;//总组数 auto data = readGroups(groups); int i = 1; for (const auto &group : data) { cout << "Case #" << i << ": " << Max(group) << endl; i++; }; return 0; }
- 1
信息
- ID
- 296
- 时间
- 2000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- 递交数
- 29
- 已通过
- 5
- 上传者