题目:

Description

【问题描述】

从n个数中选若干(至少1)个数求和,求所有方案中第k小的和(和相同但取法不同的视为不同方案)。
【输入格式】
    第一行输入2个正整数n,k。
    第二行输入这n个正整数。
【输出格式】
    输出第k小的和。
【样例输入】
5 12
1 2 3 5 8
【样例输出】
8
【样例解释】
    前12小的和分别为:1 2 3 3 4 5 5 6 6 7 8 8
【数据规模和约定】
    测试点1,n<=16。
    测试点2-3,n<=100,k<=500。
    测试点4-5,n<=1000,k<=5000。
    测试点6-8,n<=10^5,k<=5*10^5。
    测试点9-10,n<=35。
    对于所有数据,1<=k<2^n,n个正整数每个都不超过10^9。


题解:

  80%数据:用二元组(sum,i)表示和为sum,当前考虑第i个位置是否要选,以sum+a[i]为权值维护。
每次扩展到(sum+a[i],i)和(sum,i+1)。
时间复杂度O(KlogK)
剩下20%数据:二分答案以后折半搜索,时间复杂度O(2^{K/2}logW)

心得:

  优先队列是个好东西,折半搜索是个好东西;

代码:

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<string>
#include<algorithm>
#include<cmath>
#include<ctime>
#include<cctype>
#include<queue>
using namespace std;
const int N=;
const int M=1e7+;
struct node
{
long long sum;
int pos;
node(long long sum,int pos):sum(sum),pos(pos){}
};
inline bool operator < (const node &a,const node &b)
{
return a.sum>b.sum;
}
priority_queue<node>que;
long long num[N];
long long vala[M],valb[M];
long long k;
int tota=,totb=;
int n;
void solve1()
{
que.push(node(num[],));
for(int i=;i<k;i++)
{
long long tsum=que.top().sum;
int tpos=que.top().pos;
que.pop();
if(tpos<=n)
{
que.push(node(tsum-num[tpos-]+num[tpos],tpos+));
que.push(node(tsum+num[tpos],tpos+));
}
}
printf("%lld\n",que.top().sum);
}
void dfs1(int u,int des,long long val)
{
if(u>des)
{
if(val)
vala[++tota]=val;
}
else
{
dfs1(u+,des,val+num[u]);
dfs1(u+,des,val);
}
}
void dfs2(int u,int des,long long val)
{
if(u>des)
if(val)
valb[++totb]=val;
else
{
dfs2(u+,des,val+num[u]);
dfs2(u+,des,val);
}
}
bool jud(long long val)
{
long long temp=;
int j=;
for(int i=tota;i>=;i--)
{
if(vala[i]>val) continue;
for(;j<=totb&&vala[i]+valb[j]<=val;j++);
temp+=j;
}
return temp>k;
}
void solve2()
{
dfs1(,n/,);
dfs2(n/+,n,);
sort(vala+,vala+tota+);
sort(valb+,valb+totb+);
long long l=,r=0x3f3f3f3f3f3f3f3f;
while(l<=r)
{
long long mid=(l+r)/;
if(jud(mid)) r=mid-;
else l=mid+;
}
printf("%lld\n",r+);
}
int main()
{
scanf("%d%lld",&n,&k);
for(int i=;i<=n;i++)
scanf("%lld",&num[i]);
sort(num+,num+n+);
long long j=0x3f3f3f3f3f3f3f3f;
if(n>) solve1();
else solve2();
}

北京集训TEST13——PA(第k小数)的更多相关文章

  1. 北京集训TEST13——PA(Goodness)

    题目: Description 桌面上放有 n 张卡牌.对于每张卡牌,一面是绿色的,另一面是红色的.卡牌的每一面都标有一个整数.对于卡牌a和卡牌b,卡牌a对卡牌b的好感度为卡牌a绿色面的数与卡牌b红色 ...

  2. 北京集训TEST12——PA( Mortal Kombat)

    题目: Description 有一天,有N个外星人企图入侵地球.地球派出全球战斗力最强的M个人代表人类对抗外星人.根据外星的战斗规则,每个外星人应该分别与一名地球人对战(不同的外星人要与不同的地球人 ...

  3. 求两个有序序列合并成新有序序列的中位数,求第k小数

    此算法涉及一个重要数学结论:如果A[k/2-1]<B[k/2-1],那么A[0]~A[k/2-1]一定在第k小的数的序列当中,可以用反证法证明. 算法思想如下: 1,假设A长度为m,B长度为n, ...

  4. 第K 小数

    [问题描述]有两个正整数数列,元素个数分别为N和M.从两个数列中分别任取一个数相乘,这样一共可以得到N*M个数,询问这N*M个数中第K小数是多少.[输入格式]输入文件名为number.in.输入文件包 ...

  5. 数组第K小数问题 及其对于 快排和堆排 的相关优化比较

    题目描述 给定一个整数数组a[0,...,n-1],求数组中第k小数 输入描述 首先输入数组长度n和k,其中1<=n<=5000, 1<=k<=n 然后输出n个整形元素,每个数 ...

  6. Bsoj 1322 第K小数

    第K小数 Description 现在已有N个整数,你有以下三种操作: 1 A:表示加入一个值为A的整数: 2 B:表示删除其中值为B的整数: 3 K:表示输出这些整数中第K小的数: Input 第一 ...

  7. 算法打基础——顺序统计(找第k小数)

    这次主要是讲如何在线性时间下找n个元素的未排序序列中第k小的数.当然如果\(k=1 or k=n\),即找最大最小 数,线性时间内遍历即可完成,当拓展到一般,如中位数时,相关算法就值得研究了.这里还要 ...

  8. 查找第K小数

    题目描述 查找一个数组的第K小的数,注意同样大小算一样大. 如  2 1 3 4 5 2 第三小数为3. 输入描述: 输入有多组数据.每组输入n,然后输入n个整数(1<=n<=1000), ...

  9. OJ2237第k小数题解

    题目描述: 有n个数,请你找出第k小的数. 输入描述: 第一行有2个正整数n,k(n,k<=10^7)第二行有n个非负数ai(ai<=10^5) 输出描述: 输出第k小的数. 输入样例: ...

随机推荐

  1. 面试题-谈谈你对Java平台的理解

    平台无关性 GC 语言特性 面向对象 类库 异常处理 一次编译到处运行 JVM如何加载Class文件 Java反射 ClassLoader 种类 双亲委派机制 loadcalss和forName

  2. spring aop切面中获取代理bean的名字以及bean

    //切面中搞: Map<String , Object> map = (Map)ApplicationContextHelper.getBean(proceedingJoinPoint.g ...

  3. Mysql常用运算符与函数汇总

    Mysql常用运算符与函数汇总 本文给大家汇总介绍了mysql中的常用的运算符以及常用函数的用法及示例,非常的全面,有需要的小伙伴可以参考下 我们先把数据表建好 use test;create tab ...

  4. Objective-C实现一个简单的栈

    栈作为一种数据结构,是一种只能在一端进行插入和删除操作的特殊线性表.它按照先进后出的原则存储数据,先进入的数据被压入栈底,最后的数据在栈顶,需要读数据的时候从栈顶开始弹出数据(最后一个数据被第一个读出 ...

  5. 【转】MFC右键显示菜单之LoadMenu()

    如何在界面内单击右键弹出自己设置的菜单选项? 步骤如下: 1.在资源MENU里添加一个菜单资源,命名为IDR_POP_MENU. 2.在自己添加的菜单中添加事件,如事件1,事件2,事件3,分别添加响应 ...

  6. c++ sort用法 学习笔记

    c++ sort排序函数,需要加库#include<algorithm>,语法描述:sort(begin,end,cmp),cmp参数可以没有,如果没有默认非降序排序. 首先是升序排序: ...

  7. 【SAM】bzoj5084: hashit

    做得心 力 憔 悴 Description 你有一个字符串S,一开始为空串,要求支持两种操作 在S后面加入字母C 删除S最后一个字母 问每次操作后S有多少个两两不同的连续子串 Input 一行一个字符 ...

  8. 【二分 最小割】cf808F. Card Game

    Digital collectible card games have become very popular recently. So Vova decided to try one of thes ...

  9. Boostrap的自适应功能

    其实理解栅栏模式之后,自适应功能就简单很多了,根据浏览器的大小,Boostrap有四种栅栏类名提供使用,用法与Css样式表类名选择器样式调用是一样的: xs:col-xs-1 ~ col-xs-12, ...

  10. drf 认证功能

    drf(django rest-framework)认证组件 复习 HyperlinkedIdentityField ​```python 功能:快速生成连接 1. publish = seriali ...