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

本文介绍了一种通过位运算实现特定算法优化的方法。该方法利用位运算的高效特性,特别是按位或(|)和按位异或(^)操作,来简化一系列逻辑操作。通过对初始变量进行迭代更新,并最终通过按位或和按位异或操作得到简洁表达,实现了对输入序列的有效处理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题解 : 这个题目让你求少于 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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值