有n个数,共有2^n个子集,一个子集的值看做其所有数的和。
求这2^n个子集中第K小的子集。
n<=35。

meet in the middle + 二分判定

注意在双指针逼近时,相等的数带来的影响

#include<cstdio>
#include<algorithm>
#define N 262500
using namespace std;
int n,k,a[],half,note;
int tmp1[N],sum1,tmp2[N],sum2;
int l,r,mid,ans;
void dfs(int now,int tot,int *tmp,int &sum)
{
if(now>note) { tmp[++sum]=tot; return; }
dfs(now+,tot,tmp,sum);
dfs(now+,tot+a[now],tmp,sum);
}
bool check()
{
int j=sum2,cnt1,cnt2,tot=,last=;
for(int i=;i<=sum1;i++)
{
while(j && tmp1[i]+tmp2[j]>mid) j--;
if(!j) break;
cnt1=cnt2=;
while(i<sum1 && tmp1[i+]==tmp1[i]) i++,cnt1++;
while(j> && tmp2[j-]==tmp2[j]) j--,cnt2++;
tot+=last;
if(tot>=k) return false;
last=cnt1*cnt2;
}
return true;
}
int main()
{
scanf("%d%d",&n,&k); half=n>>;
for(int i=;i<=n;i++) scanf("%d",&a[i]),r+=a[i];
note=half;
dfs(,,tmp1,sum1);
note=n;
dfs(half+,,tmp2,sum2);
sort(tmp1+,tmp1+sum1+);
sort(tmp2+,tmp2+sum2+);
while(l<=r)
{
mid=l+r>>;
if(check()) ans=mid,l=mid+;
else r=mid-;
}
printf("%d",ans);
}

第k小子集的更多相关文章

  1. hdu 3949 XOR 线性基 第k小异或和

    题目链接 题意 给定\(n\)个数,对其每一个子集计算异或和,求第\(k\)小的异或和. 思路 先求得线性基. 同上题,转化为求其线性基的子集的第k小异或和. 结论 记\(n\)个数的线性基为向量组\ ...

  2. HDU 3949 XOR (线性基第k小)题解

    题意: 给出\(n\)个数,求出子集异或第\(k\)小的值,不存在输出-1. 思路: 先用线性基存所有的子集,然后对线性基每一位进行消元,保证只有\(d[i]\)的\(i\)位存在1,那么这样变成了一 ...

  3. [LeetCode] Kth Smallest Element in a Sorted Matrix 有序矩阵中第K小的元素

    Given a n x n matrix where each of the rows and columns are sorted in ascending order, find the kth ...

  4. [LeetCode] Kth Smallest Element in a BST 二叉搜索树中的第K小的元素

    Given a binary search tree, write a function kthSmallest to find the kth smallest element in it. Not ...

  5. POJ2828 Buy Tickets[树状数组第k小值 倒序]

    Buy Tickets Time Limit: 4000MS   Memory Limit: 65536K Total Submissions: 19012   Accepted: 9442 Desc ...

  6. UVA11525 Permutation[康托展开 树状数组求第k小值]

    UVA - 11525 Permutation 题意:输出1~n的所有排列,字典序大小第∑k1Si∗(K−i)!个 学了好多知识 1.康托展开 X=a[n]*(n-1)!+a[n-1]*(n-2)!+ ...

  7. *HDU2852 树状数组(求第K小的数)

    KiKi's K-Number Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)T ...

  8. 数组中第K小的数字(Google面试题)

    http://ac.jobdu.com/problem.php?pid=1534 题目1534:数组中第K小的数字 时间限制:2 秒 内存限制:128 兆 特殊判题:否 提交:1120 解决:208 ...

  9. 数据结构2 静态区间第K大/第K小

    给定数组$A[1...N]$, 区间$[L,R]$中第$K$大/小的数的指将$A[L...R]$中的数从大到小/从小到大排序后的第$K$个. "静态"指的是不带修改. 这个问题有多 ...

随机推荐

  1. c# html 导出excel

    [CustomAuthorize]        public FileResult ExportCustomerManagerVisitExcel(string dateType, string r ...

  2. Jamie and Alarm Snooze

    Description Jamie loves sleeping. One day, he decides that he needs to wake up at exactly hh: mm. Ho ...

  3. Java接口与继承作业

    为什么子类的构造方法在运行之前,必须调用父类的构造方法?能不能反过来?为什么不能反过来? 因为子类继承了父类,那么就默认的含有父类的公共成员方法和公共成员变量,这些方法和变量在子类里不再重复声明.如果 ...

  4. oracle数据库之触发器

    触发器是许多关系数据库系统都提供的一项技术.在 ORACLE 系统里,触发器类似过程和函数,都有声明,执行和异常处理过程的 PL/SQL 块. 一. 触发器类型 触发器在数据库里以独立的对象存储,它与 ...

  5. Java中I/O流之缓冲流

    Java 中的缓冲流: 1. 缓冲流要“套接”在相应的节点流之上,对读写的数据提供了缓冲的功能,提高了读写的效率,同时增加了一些新的方法(带缓冲区的,显著减少对 IO 的读写次数,保护硬盘). 2. ...

  6. ajax 返回值问题

    错误示例:function returnFlag(){ $.ajax({ type:"post", dataType:"json", data:JSON.str ...

  7. iOS音频播放概述

    在iOS系统中apple对音频播放需要的操作进行了封装并提供了不同层次的接口 下面对其中的中高层接口进行功能说明: Audio File Services:读写音频数据,可以完成播放流程中的第2步: ...

  8. GPS定位,根据经纬度查询附近地点的经纬度-sql方法实现

    根据当前所在的坐标点也即经纬度,查找数据库中附近5公里或10公里附近的所有信息的实现,经过查找资料,原来是我高二学的,就是求弦长,数学忘完了,没想到数学还这么有用,数学啊 真是用途太大了. 用到的什么 ...

  9. Filezilla 绿色版 禁止升级 能用。

    FileZilla还是挺好用的,但是如果钟情于 绿色版的话,肯定首选是 免安装绿色版.但是呢,能找到的所谓的免升级 绿色版,都不能用.只要是打开软件了,就会在你还没有设置更新之前,就已经升级号了.并且 ...

  10. Print之modile, level

    一般print打印的design都会引入module, level. xxxprint(module, level, arg,...)... 每个Module都可以有各自的bitmap,代表这个mod ...