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。。。
时间: 2024-10-13 11:55:22