Knapsack Cryptosystem
超大背包
折半查找
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
#define P pair<ll,int>
ll A[];
ll C[];
bool B[]; ll s,_n;
vector<P> v1,v2;
void dfs(int i,ll x,int n,bool f)
{ P a;
a.first=x;
int t=;
if(f)
for(int i=; i<n; i++)
{
t=t*+B[i];
}
else
{
for(int i=_n/; i<n; i++)
{
t=t*+B[i];
}
}
a.second=t;
if(f)
v1.push_back(a);
else v2.push_back(a); if(i==n)return ;
else
{
B[i]=;
dfs(i+,x+A[i],n,f);
B[i]=;
dfs(i+,x,n,f);
}
}
int main()
{
scanf("%lld%lld",&_n,&s);
for(int i=; i<_n; i++)
{
scanf("%lld",&A[i]);
}
dfs(,,_n/,);
dfs(_n/,,_n,);
sort(v1.begin(),v1.end());
sort(v2.begin(),v2.end());
int n=v1.size();int m=v2.size();
for(int i=;i<n;i++){
ll x=v1[i].first;
ll t=s-x;
int l=,r=m-;
while(l+<r){
//cout<<l<<r<<'\n';
int mid=(l+r)/;
if(v2[mid].first>t){
r=mid-;
}else if(v2[mid].first==t){
l=mid;
break;
}
else {
l=mid+;
}
}
// cout<<x<<" "<<v2[l].first<<'\n';
stack<int>st;
if(v2[l].first==s-x){
int _=v1[i].second;
for(int i=;i<_n/;i++){
st.push(_%);
_/=;
}
while(!st.empty()){
cout<<st.top();
st.pop();
}
_=v2[l].second;
for(int i=_n/;i<_n;i++){
st.push(_%);
_/=;
}
while(!st.empty()){
cout<<st.top();
st.pop();
}
break;
} }
}
Knapsack Cryptosystem的更多相关文章
- [状态压缩,折半搜索] 2019牛客暑期多校训练营(第九场)Knapsack Cryptosystem
链接:https://ac.nowcoder.com/acm/contest/889/D来源:牛客网 时间限制:C/C++ 2秒,其他语言4秒 空间限制:C/C++ 262144K,其他语言52428 ...
- 2019牛客暑期多校训练营(第九场)Knapsack Cryptosystem——哈希表&&二进制枚举
题意 有长度为 $n$($1\leq n\leq 36$)的数列,给出 $s$,求和为 $s$ 的子集,保证子集存在且唯一. 分析 答案肯定是来自左右半边两部分组成的. 如果我们用哈希表存一半,计算另 ...
- 2019牛客暑期多校训练营(第九场)-D Knapsack Cryptosystem (折半搜索)
题目链接:https://ac.nowcoder.com/acm/contest/889/D 题意:题意简单,从大小为36的集合中选若干元素使得他们的和为sum. 思路:第一感觉用搜索,复杂度为2^3 ...
- 2019牛客多校第⑨场D Knapsack Cryptosystem(折半搜索)
原题:https://ac.nowcoder.com/acm/contest/889/D 题意: 给定大小为n(<=36)的集合a,整数s,求a的一个和为s的子集(有且只有一个) 思路: 直接搜 ...
- 牛客多校第九场 D Knapsack Cryptosystem 背包
题意: 给你32个物品,给定一个容积,让你恰好把这个背包装满,求出装满的方案 题解: 暴力计算的话,复杂度$2^{32}$肯定会炸,考虑一种类似bsgs的算法,先用$2^{16}$的时间遍历前一半物品 ...
- Knapsack Cryptosystem 牛客团队赛
时限2s题意: 第一行包含两个整数,分别是n(1 <= n <= 36)和s(0 <= s <9 * 10 18) 第二行包含n个整数,它们是{a i }(0 <a i ...
- 2019牛客暑期多校训练营(第九场) D Knapsack Cryptosystem
题目 题意: 给你n(最大36)个数,让你从这n个数里面找出来一些数,使这些数的和等于s(题目输入),用到的数输出1,没有用到的数输出0 例如:3 4 2 3 4 输出:0 0 1 题解: 认真想一 ...
- NEERC-2017
A. Archery Tournament 用线段树套set维护横坐标区间内的所有圆,查询时在$O(\log n)$个set中二分查找即可. 时间复杂度$O(n\log^2n)$. #include& ...
- 中国科学技术大学第五届信息安全大赛(hackergame2018自我总结)2
这一批题都是我不会的,只能把官方write-up放在这里了 1.FLXG 的秘密 ----------------------------------------------------------- ...
随机推荐
- js while循环
<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8" ...
- 解读Nodejs多核处理模块cluste
http://blog.fens.me/nodejs-core-cluster/ Node.js开发框架Express4.x http://blog.fens.me/nodejs-express4 ...
- HNUSTOJ-1520 压缩编码
1520: 压缩编码 时间限制: 1 Sec 内存限制: 2 MB提交: 107 解决: 54[提交][状态][讨论版] 题目描述 某工业监控设备不断发回采样数据.每个数据是一个整数(0到1000 ...
- 自动清理ES索引脚本
#/bin/bash #指定日期(3个月前) DATA=`date -d "3 month ago" +%Y.%m.%d` #当前日期 time=`date` #删除3个月前的日志 ...
- JavaScript生成简单数字验证码
<!DOCTYPE html> <html lang="zh-CN"> <head> <meta charset="UTF-8& ...
- 解决solr无法加core
提示缺少配置文件:Error CREATEing SolrCore 'new_core': Unable to create core [new_core] Caused by: Can't find ...
- 学习R的悬疑录(不定期更新)
在使用caret包建模时候,没有导入机器学习包,如rpart.randomForest等,并不会对结果有影响.不知道是不是caret包内置了机器学习模块. # 加载r包 library(data.ta ...
- MIT-线性代数公开课
本博客是学习MIT-线性代数笔记,Gilbert Strang大神讲的通俗易懂,感兴趣的可以观看视频 其中习题集请点击 01)方程组的几何解释 02)矩阵消元 03)乘法和逆矩阵 04)A的LU分解 ...
- Python3找出List中最大_最小的N个数及索引
# -*- coding: utf-8 -*- import heapq nums = [1, 8, 2, 23, 7, -4, 18, 23, 24, 37, 2] # 最大的3个数的索引 max_ ...
- Python核心技术与实战——六|异常处理
和其他语言一样,Python中的异常处理是很重要的机制和代码规范. 一.错误与异常 通常来说程序中的错误分为两种,一种是语法错误,另一种是异常.首先要了解错误和异常的区别和联系. 语法错误比较容易理解 ...