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

D Knapsack Cryptosystem

折半搜索,晚上又去看了挑战程序设计,对于时间复杂度高的情况,可以通过牺牲空间来降低时间复杂度。先把前半部分所有可以组合的情况枚举出来,然后对于后半部分依次枚举,那么复杂度变化为O(2^36)->O(2^18+2^18log^18).显然就可做了,折半的裸题。

但是用二分写了一发,没过,感觉时二分那里的问题,或者时01字符串那里出了问题。换了map过了。

没过的二分:

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 typedef long long ll;
 4 
 5 const int maxn=530000;
 6 
 7 int n;ll m;
 8 struct node{
 9     char s[20];
10     ll sum;
11 }pre[maxn];
12 
13 bool cmp(node x,node y){
14     return x.sum<y.sum;
15 }
16 
17 ll a[37];
18 ll b[37];
19 
20 int binary_find(ll x){
21     int l=0;int r=(1<<(n/2))-1;
22     while(l<=r)
23     {
24         int mid=(l+r)/2;
25         if(pre[mid].sum==x) return mid;
26         else if(pre[mid].sum>x) r=mid-1;
27         else l=mid+1;
28     }
29     return -1;
30 }
31 int main(){
32     cin>>n>>m;
33     for(int i=0;i<n;i++) cin>>a[i];
34     int n2=n/2;
35     for(int i=n2;i<n;i++) 
36     {
37         b[i-n2]=a[i];
38     }
39     for(int i=0;i<(1<<n2);i++){
40         for(int j=0;j<n2;j++){
41             if((i>>j)&1) 
42             {
43                 pre[i].sum+=a[j];
44                 pre[i].s[j]='1';
45             }
46             else pre[i].s[j]='0';
47         }    
48     }
49     sort(pre,pre+n2,cmp);
50     /*for(int i=0;i<n-n2;i++)
51         cout <<b[i]<<" "; */
52     for(int i=0;i<(1<<(n-n2));i++)
53     {
54         char s[20];ll tms=0;
55         //cout <<"i==="<<i<<endl;
56         for(int j=0;j<n-n2;j++){
57             if((i>>j)&1)
58             {
59             //    cout <<"j==="<<j<<endl;
60             //    cout <<"in";
61                 s[j]='1';
62                 tms+=b[j];
63             }
64             else s[j]='0';
65         }
66         //cout <<tms<<endl;
67         int ans=binary_find(m-tms);
68         //cout <<m-tms<<endl;
69         //cout <<ans<<endl;
70         if(ans!=-1) 
71         {
72             //cout <<ans<<endl;
73             for(int i=0;i<n2;i++) cout <<pre[ans].s[i];
74             for(int i=0;i<n-n2;i++) cout <<s[i];
75             break;
76         }
77     }
78     return 0;
79 }
View Code

 

map:

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 typedef long long ll;
 4 
 5 
 6 ll a[37];
 7 ll b[37];
 8 map <ll,string> M;
 9 
10 int main(){
11     int n;ll sum;cin>>n>>sum;
12     for(int i=0;i<n/2;i++)    cin>>a[i];
13     for(int i=n/2;i<n;i++) cin>>b[i-n/2];
14     for(int i=0;i<(1<<(n/2));i++)
15     {
16         string s;ll tmp=0;
17         for(int j=0;j<(n/2);j++)
18         {
19             if((i>>j)&1) s+='1',tmp+=a[j];
20             else s+='0';
21         }
22         M[tmp]=s;
23     }
24     for(int i=0;i<(1<<(n-n/2));i++)
25     {
26         string s;ll tmp=0;
27         for(int j=0;j<(n-n/2);j++){
28             if((i>>j)&1) s+='1',tmp+=b[j];
29             else s+='0';
30         }
31         if(M.count(sum-tmp))
32         {
33             cout <<M[sum-tmp]<<s;
34             break;
35         }
36     } 
37     return 0;
38 }
View Code

 

转载于:https://www.cnblogs.com/Msmw/p/11362436.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
代码下载:完整代码,可直接运行 ;运行版本:2022a或2019b或2014a;若运行有问题,可私信博主; **仿真咨询 1 各类智能优化算法改进及应用** 生产调度、经济调度、装配线调度、充电优化、车间调度、发车优化、水库调度、三维装箱、物流选址、货位优化、公交排班优化、充电桩布局优化、车间布局优化、集装箱船配载优化、水泵组合优化、解医疗资源分配优化、设施布局优化、可视域基站和无人机选址优化 **2 机器学习和深度学习方面** 卷积神经网络(CNN)、LSTM、支持向量机(SVM)、最小二乘支持向量机(LSSVM)、极限学习机(ELM)、核极限学习机(KELM)、BP、RBF、宽度学习、DBN、RF、RBF、DELM、XGBOOST、TCN实现风电预测、光伏预测、电池寿命预测、辐射源识别、交通流预测、负荷预测、股价预测、PM2.5浓度预测、电池健康状态预测、水体光学参数反演、NLOS信号识别、地铁停车精准预测、变压器故障诊断 **3 图像处理方面** 图像识别、图像分割、图像检测、图像隐藏、图像配准、图像拼接、图像融合、图像增强、图像压缩感知 **4 路径规划方面** 旅行商问题(TSP)、车辆路径问题(VRP、MVRP、CVRP、VRPTW等)、无人机三维路径规划、无人机协同、无人机编队、机器人路径规划、栅格地图路径规划、多式联运运输问题、车辆协同无人机路径规划、天线线性阵列分布优化、车间布局优化 **5 无人机应用方面** 无人机路径规划、无人机控制、无人机编队、无人机协同、无人机任务分配 **6 无线传感器定位及布局方面** 传感器部署优化、通信协议优化、路由优化、目标定位优化、Dv-Hop定位优化、Leach协议优化、WSN覆盖优化、组播优化、RSSI定位优化 **7 信号处理方面** 信号识别、信号加密、信号去噪、信号增强、雷达信号处理、信号水印嵌入提取、肌电信号、脑电信号、信号配时优化 **8 电力系统方面** 微电网优化、无功优化、配电网重构、储能配置 **9 元胞自动机方面** 交通流 人群疏散 病毒扩散 晶体生长 **10 雷达方面** 卡尔曼滤波跟踪、航迹关联、航迹融合

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值