• 第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。。。

  • 相关阅读:
    final关键字
    this and super
    java 内存分析之static
    java 内存分析之this
    java 内存分析之方法返回值二
    java 内存分析之方法返回值及匿名对象一
    java 内存分析之构造方法执行过程
    java 内存分析之堆栈空间
    java jvm概述及工作过程中的内存管理
    java 编译器
  • 原文地址:https://www.cnblogs.com/zzyh/p/7608077.html
Copyright © 2020-2023  润新知