这道题,首先第一思路可能是把所有情况列出来,但一定会超时的,到最后会有2的2048次方的情况,我们1来看数据范围,bi小于等于2048,那么这些所有的情况一定是小于2048的,所以可以开一个2048的数组,把所以出现过的数字记录,另外要注意最近的一组数据要覆盖住旧的出现过的数字
#include <iostream>
#include <bitset>
#include <vector>
using namespace std;
const int MAXV = 2048;
int main() {
int n;
cin >> n;
vector<int> a(n), b(n);
for (int i = 0; i < n; ++i) cin >> a[i];
for (int i = 0; i < n; ++i) cin >> b[i];
bitset<MAXV> dp; // 当前可能的值
dp[0] = 1; // 初始只有0
for (int i = 0; i < n; ++i) {
bitset<MAXV> ndp; // 下一步可能的值
for (int x = 0; x < MAXV; ++x) {
if (dp[x]) {
// 规则一:减法
int v1 = max(0, x - a[i]);
ndp[v1] = 1;
// 规则二:异或
int v2 = x ^ b[i];
ndp[v2] = 1;
}
}
dp = ndp; // 滚动更新
}
// 从大到小找最大值
for (int ans = MAXV - 1; ans >= 0; --ans) {
if (dp[ans]) {
cout << ans << endl;
break;
}
}
return 0;
}
推荐使用bitset

京公网安备 11010502036488号