您的位置:首页 > 其它

Codeforces Round #443 (Div. 2) C Short Program

2017-10-27 12:40 357 查看

题解 : 这个题目让你求少于 5 个的一种表示,对于每一个数的使用。其实就是对于每个数的每一位不管是 0 还是 1 都可以变成相应的数 我们就可以先让每一位都是 0 和每一位都是1 的数 (0 和 1023) 分别对这些操作进行操作,然后,这样的话我们就知道了每一位0、1操作之后变成了什么东西,然后我们就可以仅用 | 和 ^操作表示这些操作 ans <= 2; 具体细节看代码.

#include <iostream>
#include <algorithm>
#include <cstring>

using namespace std;

int main () {
ios_base :: sync_with_stdio(false);
int n;
cin >> n;
int a = 0,b = 1023;
for (int i = 1;i <= n; ++ i) {
char c;
int val;
cin >> c >> val;
if (c == '|') {
a |= val,b |= val;
}
else if (c == '&') a &= val,b &= val;
else a ^= val,b ^= val;
}
int numor = 0,numxor = 0;
for (int i = 0;i < 10; ++ i) {
int u = (1 << i);
if ((u & a) && (u & b)) {
numor += u;
}
if ((u & a) && !(u & b)) numxor += u;
if (!(u & a) && !(u & b)) {
numxor += u;
numor += u;
}
}
int ans = (numor > 0) + (numxor > 0);
cout << ans << endl;
if (numor) {
cout << '|' << ' ' << numor << endl;
}
if (numxor) {
cout << '^' << ' ' << numxor << endl;
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  codeforces 思维