运算提示可以用位运算解决。
二进制的数进行位运算,每一位都是相互独立的, 对于初始值X,我们依次讨论他每一位填0还是填1。
x0表示如果该位填0进行n次位运算后的值, x1同理。
填1的条件:x1 > x0, 且X加上后不超过边界值m。
填0的条件:x1 = x0,答案一样, 要让初始值尽量不超过边界,故填0更优;
x1 < x0, 肯定填0(初始值更小且答案更大)。
#include <bits/stdc++.h>
using namespace std;
int n, m, ans = 0, val = 0;//ans记录答案,val记录初始值
pair<string, int> a[100005];
int cal(int bit, int x) {
for (int i = 1; i <= n; i ++) {
int y = (a[i].second >> bit)& 1;
if (a[i].first == "AND") x &= y;
else if (a[i].first == "OR") x |= y;
else x ^= y;
}
return x;
}
int main() {
cin >> n >> m;
for (int i = 1; i <= n; i ++) {
char str[5]; int x;
scanf("%s %d", str, &x);
a[i] = make_pair(str, x);
}
for (int bit = 30; bit >= 0; bit --) {
int x0 = cal(bit, 0);
int x1 = cal(bit, 1);
if (x1 > x0 && (val + (1 << bit)) <= m)
val += (1 << bit), ans += (x1 << bit);
else ans += (x0 << bit);
}
cout << ans;
}
&spm=1001.2101.3001.5002&articleId=142579764&d=1&t=3&u=37e74d81a8b94ac59fe9f50b86ee6343)
580

被折叠的 条评论
为什么被折叠?



