题意简述
给定 $ n $ 件商品,第 $ i $ 件商品的价格为 $ A_i $,选一些商品可以组成一些价格,同一件商品可被重复选择任意多次。问这些价格中第 $ k $ 大的是多少。
Solution
注意一个细节,题目注重的仅仅是价格,而非方案,因此 多种不同的选择方案得到的同一个价格只算一次。 基于这个性质,使用 set 自带的去重功能来解决此题。
考虑到 $ n $ 很小,只有 $ 10 $,因此可以每次把最小的价格取出来,依次加上每个 $ A_i $ 再放回去,重复 $ k-1 $ 次后 set 内的第一个元素即为答案。初始化将每个 $ A_i $ 都放入 set 内,保证不漏算价格。总复杂度为 $ O(NK) $。
代码示例
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;//注意long long
ll n,k,a[200010];
set<ll> s;
int main(){
cin>>n>>k;
for(int i=1;i<=n;i++) cin>>a[i],s.insert(a[i]);
//set中此时已有第1小的价格,因此重复k-1次可得到第k小的价格
for(int i=1;i<=k-1;i++){
ll num=*s.begin();
s.erase(num);
for(int j=1;j<=n;j++) s.insert(num+a[j]);
}
cout<<(*s.begin())<<endl;
return 0;
}