CSP-S2020第二题(动物园)题解

解题思路
先找出所有被至少一个动物编号覆盖的二进制位。
如果某个二进制位对应一种饲料,但这个位没有被现有的动物覆盖,则新增的动物编号不能覆盖该位,否则会出现新饲料类型。
假如最后有 x 位可以被覆盖,最终答案为 2^x−n。
特别注意:需要考虑部分边界情况
参考代码

#include <bits/stdc++.h>
using namespace std;
const string str = "18446744073709551616"; const int N = 65;
bool vis[N], flag[N];
int main() {
	int n, m, c, k; cin >> n >> m >> c >> k;
 	for (int i = 1; i <= n; ++i) {
    	unsigned long long x; cin >> x;
    	for (int j = k - 1; j >= 0; --j) {
			vis[j] |= (x >> j) & 1;
		} 
  	}
  	for (int i = 1; i <= m; ++i) {
    	int p, q; cin >> p >> q;
    	if (!vis[p]) {
			flag[p] = true;
		}
  	}
  	int sum = 0;
  	for (int i = 0; i < k; ++i) {
  		if (flag[i]) {
  			++sum;
		}
	} 
  	if (k - sum == 64) {
    	if (n) { 
      		cout << (unsigned long long) -n << '\n';
      	} else { 
      		cout << str << '\n';
      	}
  	} else { 
  	  	cout << (1ull << (k - sum)) - n << '\n';
  	}
  	return 0;
}
  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

蒟蒻一枚

谢谢鸭~

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值