[CSP-S2020] 动物园
[CSP-S2020] 动物园
题目描述
动物园里饲养了很多动物,饲养员小 A 会根据饲养动物的情况,按照《饲养指南》购买不同种类的饲料,并将购买清单发给采购员小 B。
具体而言,动物世界里存在
《饲养指南》中共有
根据《饲养指南》,小 A 将会制定饲料清单交给小 B,由小 B 购买饲料。清单形如一个
现在小 B 想请你帮忙算算,动物园目前还能饲养多少种动物。
输入格式
第一行包含四个以空格分隔的整数
分别表示动物园中动物数量、《饲养指南》要求数、饲料种数与动物编号的二进制表示位数。
第二行
接下来
数据保证所有
输出格式
仅一行一个整数表示答案。
样例 #1
样例输入 #1
3 3 5 4
1 4 6
0 3
2 4
2 5
样例输出 #1
13
样例 #2
样例输入 #2
2 2 4 3
1 2
1 3
2 4
样例输出 #2
2
样例 #3
样例输入 #3
见附件中的 zoo/zoo3.in
样例输出 #3
见附件中的 zoo/zoo3.ans
提示
【样例 #1 解释】
动物园里饲养了编号为
- 若饲养的某种动物的编号的第
个二进制位为 ,则需购买第 种饲料。 - 若饲养的某种动物的编号的第
个二进制位为 ,则需购买第 种饲料。 - 若饲养的某种动物的编号的第
个二进制位为 ,则需购买第 种饲料。
饲料购买情况为:
- 编号为
的动物的第 个二进制位为 ,因此需要购买第 种饲料; - 编号为
的动物的第 个二进制位为 ,因此需要购买第 种饲料。
由于在当前动物园中加入一种编号为
【数据范围】
对于
对于
对于
对于
解答
第一步我们要统计n个数中有哪些位是有一的,第二步我们要分别统计
取出每个位的数是log(n),第一步是nlogn,第二步如果和第一步一样算会超时。
考虑第一步会重复大量运算,这里可以在第一步把所有数做或运算,这样就是n+logn,
但重点依然是第二步怎么处理,怎样算出最大能容纳新数的个数呢?
暴力的算法是提出每一个数的每一个位两两比较,这样有
改变思维,我们拿位做比较,我们取出在第一步中不是1的位,那么撑死是64个,我们把每个数都拿出来:num&(1<<k)==1?
时间复杂度是
我们思考考虑位的做法。
样例输入 #1
3 3 5 4
1 4 6
0 3
2 4
2 5
样例输出 #1
13
10000
110 001 100
需要考虑的位有0,2
或:111
0,2,都有,满足全部条件
最高要考虑的位为第二位。所以3,4位没关系。
2 *2 * 2 * 2 - 3 = 13
即每个位的可能性相乘-原来有的数
样例输入 #2
2 2 4 3
1 2
1 3
2 4
样例输出 #2
样例二手摸:
8
1 2
1 3
2 4
0 1 2 3 4 5 6 7
0 3,共两种
01 10 ——> 11
需要考虑的位有1,2
所以第二位必须是0
1 * 2 * 2-2=2
那么上代码吧,懒得解释了:
时间复杂度极低,稳过懒得算了。
代码,60分代码
#include<bits/stdc++.h>
using namespace std;
#define ull unsigned long long
#define rt register int
int n,m,c,k,useless;
ull a[1000005];
int b[1000005];
int book[100000];
int Real[100000];
int main()
{
scanf("%d%d%d%d",&n,&m,&c,&k);
if(n==0&&m==0&&k==64){printf("18446744073709551616");return 0;}
for(rt i=1;i<=n;++i)scanf("%lld",&a[i]);
for(rt i=1;i<=m;++i)
{
scanf("%d",&b[i]);
scanf("%d",&useless);
}
ull endnum=0;
for(rt i=1;i<=n;++i)endnum|=a[i];
int cnt=0;
while(endnum>0){
if(endnum&1)Real[cnt]=1;
endnum>>=1;
++cnt;
}
for(rt i=0;i<=10000;++i)book[i]=2;
for(rt i=1;i<=m;++i)if(!Real[b[i]])book[b[i]]=1;
unsigned long long ans=1;
for(rt i=k-1;i>=0;i--)ans*=book[i];
ans-=n;
printf("%lld",ans);
return 0;
}
本文作者:zychh
本文链接:https://www.cnblogs.com/zychh/p/16742081.html
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步