[状态压缩,折半搜索] 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 ...
随机推荐
- HTML笔记02
网页中的颜色有三种表示方法 颜色单词:blue.green.red.yellow 10进制表示:rgb(255,0,0).rgb(0,255,0).rgb(0,0,255) 16进制表示:#ff000 ...
- Vue源码之数据驱动(个人向)
#1.大致流程 # 2.具体流程 数据驱动 New VUE Where:src/core/instance/index.js Do: 1.使用Function实现Vue类 2.调用_init 初始化V ...
- 在线选题系统完善篇(PHP)
第一篇: 选题在线提交系统(html+JS+PHP) 这是当时根据需求做的一个简单的版本,只能适用于这一个场景,而且题目等一系列数据都不能改.然后结束后,我又对重新写了一个有后台管理的选题系统.相对于 ...
- C与C++面试易出知识点
.1. char c = '\72'; 中的\72代表一个字符,72是八进制数,代表ASCII码字符":". 2. 10*a++ 中a先进行乘法运算再自增(笔试中经常喜欢出这类运算 ...
- Solr查询配置及优化【eDisMax查询解析器】
一.简介 Lucene查询解析器语法支持创建任意复杂的布尔查询,但还有一些缺点,它不是用户查询处理的理想解决方案.这里面最大的问题是Lucene查询解析器的语法要求严格,一旦破坏就会抛出异常.指望用户 ...
- tfgan折腾笔记(二):核心函数详述——gan_model族
定义model的函数有: 1.gan_model 函数原型: def gan_model( # Lambdas defining models. generator_fn, discriminator ...
- pycharm 关于模块安装出现的“[error] Microsoft Visual C++ 14.0 is required” 解决办法
刚才正准备对pycharm进行一番操作的时候,噔 噔磴噔噔 “no module define xxx” ,那我当然要把xxx给搞到pycharm上来啊, 不一会功夫 ,biu~ “[error] ...
- sql -- 多表关联,update(用户奖励)
表设计: users_buy: users_score: 需求: 1.根据用户分组,找出用户消费最高的金额 select user_name, max(paymoney) as pm from use ...
- 手写Promise原理
我的promise能实现什么? 1:解决回调地狱,实现异步 2:可以链式调用,可以嵌套调用 3:有等待态到成功态的方法,有等待态到失败态的方法 4:可以衍生出周边的方法,如Promise.resolv ...
- 【Vue】---- 手动封装on,emit,off
一.概念 1. $on("事件名称",回调函数) 事件绑定,一个事件名称上面可能绑定多个函数 2. $emit("事件名称",需要传递的值) 事件触发时,会触发 ...