专栏文章

题解:P7076 [CSP-S2020] 动物园

P7076题解参与者 3已保存评论 2

文章操作

快速查看文章及其快照的属性,并进行相关操作。

当前评论
2 条
当前快照
1 份
快照标识符
@miqnele5
此快照首次捕获于
2025/12/04 07:38
3 个月前
此快照最后确认于
2025/12/04 07:38
3 个月前
查看原文

题目传送门


思路:

水题中的水题。这题如果放在普及组,可能也就是第二三题。
这题是一道关系进制的问题。
先找出所有被至少一个动物编号覆盖的二进制位。
如果某个二进制位对应一种饲料,但该位没有被现有的动物覆盖,则新增的动物编号不能覆盖该位(否则会导致出现新的饲料类型)。

代码讲解:

这题有以下几个需要注意的地方。
  • 数据范围,需要开到 unsigned 才行。
CPP
unsigned long long n, m, c, k, a, p, q, ans = 0, cnt = 1, g = 0;
  • 特判程序。这样防止溢出。
CPP
if (!n && !m && k == 64) {
    printf("18446744073709551616");
    return 0;
} 
  • 主程序
CPP
for (int i = 0; i < m; i++) {
		cin >> p >> q;
		if (!((g >> p) & 1) && !v[p]) {
			ans--;
			v[p] = 1;
		} 
	}

code:

CPP
#include <bits/stdc++.h>
using namespace std;

unsigned long long n, m, c, k, a, p, q, ans = 0, cnt = 1, g = 0;
bool v[65];

int main() {
	cin >> n >> m >> c >> k; 
	ans = k;
	if (!n && !m && k == 64) {
		printf("18446744073709551616");
		return 0;
	} 
	for (int i = 1; i <= n; i++) {
		cin >> a;
		g |= a;
	}
	for (int i = 0; i < m; i++) {
		cin >> p >> q;
		if (!((g >> p) & 1) && !v[p]) {
			ans--;
			v[p] = 1;
		} 
	}
	for (int i = 1; i <= ans; i++) cnt *= 2;
	printf("%llu\n", cnt - n);
	return 0;
}

评论

2 条评论,欢迎与作者交流。

正在加载评论...