[状态压缩,折半搜索] 2019牛客暑期多校训练营(第九场)Knapsack Cryptosystem
链接:https://ac.nowcoder.com/acm/contest/889/D
来源:牛客网
空间限制:C/C++ 262144K,其他语言524288K
64bit IO Format: %lld
题目描述
输入描述:
输出描述:
Output a 01 sequence. If the i-th digit is 1, then ai is in the subset.
If the i-th digit is 0, then ai is not in the subset.
输入
36 68719476735
1 2 4 8 16 32 64 128 256 512 1024 2048 4096 8192 16384 32768 65536 131072 262144 524288 1048576 2097152 4194304 8388608 16777216 33554432 67108864 134217728 268435456 536870912 1073741824 2147483648 4294967296 8589934592 17179869184 34359738368
输出
111111111111111111111111111111111111
题意:
给n个数,和一个和s,要在这n个数中找到一个子集使得他们之和等于s并用二进制表示(0代表不用第i个数,1代表用第i个数)
思路:
考虑枚举这n个数,但n最大到36,也就是说最多有2的36次方种情况大约是1e10,这样在1秒内跑不完
于是就需要枚举前n/2个数和后n/2个数,这样最多有2*(2的18次方)种情况,大约是5e5,在1秒内可以跑完
那怎么枚举呢?可以用二进制来表示状态,二进制的第i位为0代表不用第i个数,为1代表用第i个数并加到可能答案中,从0到2的n/2次方也就是从全不选到全选的全排列,
我们把二进制数和他表示的和(可能答案)对应起来,枚举完前n/2个数后在后n/2个数中用s减去当前这种情况得到的可能答案看能否在前n/2种可能答案中找到
如果找得到就说明现在这种情况和前面的那种情况之和能为s,输出二进制即可
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int n;
ll s,a[],t;
map<ll,ll> mp;
ll convert(ll x,int pos){
ll ans=,i=pos;
while(x){
if(x&)ans+=a[i]; ///如果现在这个状态的这一位为1,则加上这一位的数
x>>=;
i++;
}
return ans;
}
void out(ll x,int cnt){
while(cnt--){
printf("%d",(x&));
x>>=;
}
}
int main(){
scanf("%d%lld",&n,&s);
for(int i=;i<=n;i++)scanf("%lld",&a[i]);
int mid=n/;
for(int i=;i<(<<mid);i++)mp[convert(i,)]=i; ///从0到2的n/2次方也就是从全不选到全选的全排列
for(int i=;i<(<<(n-mid));i++){
t=convert(i,mid+);
if(mp.count(s-t)){
int j=mp[s-t];
out(j,mid); ///要输出n/2个数
out(i,mid); ///要输出n/2个数
}
}
}
/**
给n个数,和一个和s,要在这n个数中找到一个子集使得他们之和等于s并用二进制表示(0代表不用第i个数,1代表用第i个数)
考虑枚举这n个数,但n最大到36,也就是说最多有2的36次方种情况大约是1e10,这样在1秒内跑不完
于是就需要枚举前n/2个数和后n/2个数,这样最多有2*(2的18次方)种情况,大约是5e5,在1秒内可以跑完
那怎么枚举呢?可以用二进制来表示状态,二进制的第i位为0代表不用第i个数,为1代表用第i个数并加到可能答案中,从0到2的n/2次方也就是从全不选到全选的全排列,
我们把二进制数和他表示的和(可能答案)对应起来,枚举完前n/2个数后在后n/2个数中用s减去当前这种情况得到的可能答案看能否在前n/2种可能答案中找到
如果找得到就说明现在这种情况和前面的那种情况之和能为s,输出二进制即可
**/
[状态压缩,折半搜索] 2019牛客暑期多校训练营(第九场)Knapsack Cryptosystem的更多相关文章
- 2019牛客暑期多校训练营(第九场) D Knapsack Cryptosystem
题目 题意: 给你n(最大36)个数,让你从这n个数里面找出来一些数,使这些数的和等于s(题目输入),用到的数输出1,没有用到的数输出0 例如:3 4 2 3 4 输出:0 0 1 题解: 认真想一 ...
- 2019牛客暑期多校训练营(第二场) H-Second Large Rectangle(单调栈)
题意:给出由01组成的矩阵,求求全是1的次大子矩阵. 思路: 单调栈 全是1的最大子矩阵的变形,不能直接把所有的面积存起来然后排序取第二大的,因为次大子矩阵可能在最大子矩阵里面,比如: 1 0 0 1 ...
- 2019牛客暑期多校训练营(第五场)G - subsequeue 1 (一题我真的不会的题)
layout: post title: 2019牛客暑期多校训练营(第五场)G - subsequeue 1 (一题我真的不会的题) author: "luowentaoaa" c ...
- 2019牛客暑期多校训练营(第九场)-D Knapsack Cryptosystem (折半搜索)
题目链接:https://ac.nowcoder.com/acm/contest/889/D 题意:题意简单,从大小为36的集合中选若干元素使得他们的和为sum. 思路:第一感觉用搜索,复杂度为2^3 ...
- 2019牛客暑期多校训练营(第二场)F.Partition problem
链接:https://ac.nowcoder.com/acm/contest/882/F来源:牛客网 Given 2N people, you need to assign each of them ...
- 2019牛客暑期多校训练营(第一场)A题【单调栈】(补题)
链接:https://ac.nowcoder.com/acm/contest/881/A来源:牛客网 题目描述 Two arrays u and v each with m distinct elem ...
- 2019牛客暑期多校训练营(第九场)A:Power of Fibonacci(斐波拉契幂次和)
题意:求Σfi^m%p. zoj上p是1e9+7,牛客是1e9: 对于这两个,分别有不同的做法. 前者利用公式,公式里面有sqrt(5),我们只需要二次剩余求即可. 后者mod=1e9,5才 ...
- 2019牛客暑期多校训练营(第九场)Knapsack Cryptosystem——哈希表&&二进制枚举
题意 有长度为 $n$($1\leq n\leq 36$)的数列,给出 $s$,求和为 $s$ 的子集,保证子集存在且唯一. 分析 答案肯定是来自左右半边两部分组成的. 如果我们用哈希表存一半,计算另 ...
- 2019牛客暑期多校训练营(第一场) B Integration (数学)
链接:https://ac.nowcoder.com/acm/contest/881/B 来源:牛客网 Integration 时间限制:C/C++ 2秒,其他语言4秒 空间限制:C/C++ 5242 ...
随机推荐
- OPPO招聘-互联网测试
邮 箱:ljy@oppo.com 工作地点:深圳
- rpmbuild 实践
安装 rpmbuild 1 # yum install -y rpm-build 查看 rpmbuild 相关的宏和参数 12345678 # rpmbuild --showrc | grep --c ...
- 【桌面篇】Archlinux安装kde桌面
ArchLinux安装配置手册[桌面篇] 现在你的U盘可以拔掉了,重启后会发现和刚刚没什么区别,还是命令行的界面,别着急现在就带你安装桌面环境. 连接网络 首先检查一下网络是否连接成功 ping ww ...
- Context与ApplicationContext的区别
ApplicationContext并没有这个类,其实更应该叫做:Activity与Application在作为Context时的区别.嗯,的确是这样的,大家在需要Context的时候,如果是在Act ...
- 动态构造任意复杂的 Linq Where 表达式
前言 Linq 是 C# 中一个非常好用的集合处理库,用好了能帮我们简化大量又臭又长的嵌套循环,使处理逻辑清晰可见.EF 查询主要也是依赖 Linq.但是 Linq 相对 sql 也存在一些缺点,最主 ...
- Java - 常见的算法
二分法查找 private static int binarySearch(int[] list,int target) { ; ; //直到low>high时还没找到关键字就结束查找,返回-1 ...
- Python - loguru日志库,高效输出控制台日志和日志记录
一.安装loguru loguru的PyPI地址为:https://pypi.org/project/loguru/ GitHub仓库地址为:https://github.com/Delgan/log ...
- (数据科学学习手札79)基于geopandas的空间数据分析——深入浅出分层设色
本文对应代码和数据已上传至我的Github仓库https://github.com/CNFeffery/DataScienceStudyNotes 1 简介 通过前面的文章,我们已经对geopanda ...
- 从0开始搭建一个阿里云java部署环境
一.购买服务器 https://www.aliyun.com/daily-act/ecs/activity_selection?spm=5176.8112568.738194.8.674c9ed53Y ...
- 2020ubuntu1804server编译安装redis5笔记(二)配置redis
前一篇笔记记录了ubuntu1804server编译安装redis5,接下来要配置redis5了 网址:https://www.cnblogs.com/qumogu/p/12435694.html 第 ...