首页 > TAG信息列表 > cryptosystem

2019牛客暑期多校训练营(第九场) Knapsack Cryptosystem

时间限制:C/C++ 2秒,其他语言4秒 空间限制:C/C++ 262144K,其他语言524288K 64bit IO Format: %lld 题目描述 Amy asks Mr. B  problem D. Please help Mr. B to solve the following problem. Amy wants to crack Merkle–Hellman knapsack cryptosystem. Please help it.

2019牛客暑期多校训练营(第九场) D Knapsack Cryptosystem 折半查找

sample input1: 8 1129 295 592 301 14 28 353 120 236 sample out1: 01100001 sample input2: 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

原 2019牛客暑期多校训练营(第九场) D Knapsack Cryptosystem 超大背包(二分搜索)

链接:https://ac.nowcoder.com/acm/contest/889/D?&headNav=acm 来源:牛客网   时间限制:C/C++ 2秒,其他语言4秒 空间限制:C/C++ 262144K,其他语言524288K 64bit IO Format: %lld 题目描述 Amy asks Mr. B  problem D. Please help Mr. B to solve the following problem.   Amy

2019牛客暑期多校训练营(第九场) - D - Knapsack Cryptosystem(折半枚举)

题目链接:https://ac.nowcoder.com/acm/contest/889/D 题意:挑选若干个数使得和为s。 思路:考虑二进制枚举,但是n的范围是36,直接枚举会超时,所以我们把数组分两部分枚举,然后用map映射一下即可。 #include <bits/stdc++.h> using namespace std; #define ll long long ll a[50], su

Knapsack Cryptosystem(折半搜索)

Knapsack Cryptosystem 让你求用n个数中任意选择多个加和组成m,让你输出方案。 分析:首先可以想到的是暴力搜索但是2^36次方显然是不可以的,因而我们可以采用折半搜索,分两组爆搜答案,从而大大减少时间复杂度。 #include <bits/stdc++.h> using namespace std; #define ll long lo

2019牛客暑期多校训练营(第九场)Knapsack Cryptosystem——哈希表&&二进制枚举

题意 有长度为 $n$($1\leq n\leq 36$)的数列,给出 $s$,求和为 $s$ 的子集,保证子集存在且唯一。 分析 答案肯定是来自左右半边两部分组成的。 如果我们用哈希表存一半,计算另一半的值 $v$,再在哈希表中查找 $s-v$,这样规模从 $2^{36}$ 降至 $2^{18}$,其实就是折半搜索。 #include<bits/std

2019牛客暑期多校训练营(第九场)-D Knapsack Cryptosystem (折半搜索)

题目链接:https://ac.nowcoder.com/acm/contest/889/D 题意:题意简单,从大小为36的集合中选若干元素使得他们的和为sum。 思路:第一感觉用搜索,复杂度为2^36,需要优化,正好用折半搜索。即在前一半枚举,并用map记录和,枚举后一半时查找是否存在前一半刚好满足两者的和为sum。 AC代码: #inclu

2019牛客多校第⑨场D Knapsack Cryptosystem(折半搜索)

题意:给定大小为n(<=36)的集合a,整数s,求a的一个和为s的子集(有且只有一个) 直接搜索要\(2^{36}\)次,时间过多,考虑一次搜索前半集合,一次搜索后半集合,得到两个\(2^{16}\)的答案数组,就变成了双数组匹配问题 #include <algorithm> #include <iostream> #include <cstdio> using namespace