第k小和(搜索)

Posted 小时のblog

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了第k小和(搜索)相关的知识,希望对你有一定的参考价值。

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%,dfs+优先队列优化

#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
#include<algorithm>
#define LL long long
using namespace std;
int n,k,a[1000];
struct node{
    LL val;int pos;
    node(LL val,int pos):val(val),pos(pos){}
    bool operator < (const node &a) const{
        return val>a.val;
    }
};
priority_queue<node>q;
int main(){
    scanf("%d%d",&n,&k);
    for(int i=1;i<=n;i++)scanf("%d",&a[i]);
    sort(a+1,a+n+1);
    q.push(node(a[1],2));
    for(int i=1;i<=k;i++){
        node now=q.top();q.pop();
        LL v=now.val;int pos=now.pos;
        if(pos<=n){
            q.push(node(v-a[pos-1]+a[pos],pos+1));
            q.push(node(v+a[pos],pos+1));  
        }
    } 
    cout<<q.top().val<<endl;
    return 0;
}

100% tomorrow。。。

以上是关于第k小和(搜索)的主要内容,如果未能解决你的问题,请参考以下文章

《安富莱嵌入式周报》第279期:强劲的代码片段搜索工具,卡内基梅隆大学安全可靠C编码标准,Nordic发布双频WiFi6 nRF7002芯片

《程序员代码面试指南》第八章 数组和矩阵问题 计算数组的小和

二叉搜索树的第k个结点(第k小)

算法归并排序 小和 问题

精选力扣500题 第62题 剑指 Offer 54. 二叉搜索树的第k大节点c++/java详细题解

归并排序应用-------小和问题