博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
k`th number
阅读量:6234 次
发布时间:2019-06-21

本文共 1172 字,大约阅读时间需要 3 分钟。

折半搜索(meet in the middle)和two point;

题目:有n个数,共有2^n个子集,一个子集的值看做其所有数的和。
求这2^n个子集中第K大的子集。
n<=35.
观察数据范围,如果直接搜索会爆栈的,所以就有了折半搜索。
将两部分的结果两两任意组合就构成了所有的集合。
用二分(判定用two point)来判断
代码(二分有点问题,暂且贴上,还望指正):

#include
#include
#include
#include
using namespace std;int n,a[1009],k;int b[(1<<20)],c[(1<<20)],cnt1=1,cnt2=1;int L,R;void dfs1(int x,int sum){ if(x>n/2) return; b[++cnt1]=sum+a[x]; dfs1(x+1,sum+a[x]); dfs1(x+1,sum);}void dfs2(int x,int sum){ if(x>n) return; c[++cnt2]=sum+a[x]; dfs2(x+1,sum+a[x]); dfs2(x+1,sum);}int check(int x){ int t1=1,t2=cnt2,sum=0; while(t1<=cnt1&&t2>=1) { while(b[t1]+c[t2]>=x&&t2>=1) t2--; sum+=t2; t1++; } return sum;//比它小的有sum个 }int main(){ scanf("%d%d",&n,&k); for(int i=1;i<=n;i++) scanf("%d",&a[i]),R+=a[i]; dfs1(1,0); dfs2(n/2+1,0);//折半搜索 sort(b+1,b+cnt1+1); sort(c+1,c+cnt2+1); k=(1<
>1; if(check(mid)>=k) R=mid-1;//子集中没有重复要把 = 去掉!!!!!!!!!! else L=mid+1; } printf("%d",R); return 0;}

转载于:https://www.cnblogs.com/dfsac/p/7587897.html

你可能感兴趣的文章
[番外篇]k位精巧数
查看>>
Spring Security实战 - 短信登录
查看>>
(九)企业级java springcloud b2bc商城系统开源源码二次开发:配置中心和消息总线(配置中心终结版)...
查看>>
Redis 数据采样
查看>>
ELK搭建以及使用大全
查看>>
本地HOSTS测试管理工具
查看>>
httpwatch使用技巧
查看>>
视图的with check option解释
查看>>
我的友情链接
查看>>
安装nginx+tomcat
查看>>
Android配置环境与引入第三方jar包
查看>>
我的友情链接
查看>>
iOS中UIWebView与其中网页的javascript的交互
查看>>
For语句实现批量创建AD用户
查看>>
MAC与LINUX之间的文件通信
查看>>
【MyBatis框架】SqlMapConfigl配置文件之常用的setting设置
查看>>
条件编译
查看>>
京东金融大数据竞赛猪脸识别(1)-从视频提取图像
查看>>
CentOS6.x/CentOS7.x一键安装mysql5.6/5.7并定制数据目录
查看>>
iOS消息转发机制
查看>>