介绍及翻译
详情请看
题目传送门
在AtCoder王国,有N种章鱼烧(球形日本食物)出售。第i种章鱼烧卖一日元。高桥君至少会买一个章鱼烧。他可以多买同一种的章鱼烧。找出高桥可能支付的第k个最低价格。在这里,如果有多套相同价格的章鱼烧,价格只计算一次。
思路
这个题目可以这样理解,最小的数是直接可以知道的,即20,那么从20往后,每次都是用当前数加一遍序列里的所有数,然后把当前数删除,再找下一个最小数,这个最小数再把序列里的所有数加一遍,一直到第K个数。
可以用优先队列做!!!
代码
还是SSRS
#include <bits/stdc++.h>
using namespace std;
int main(){
int N, K;
cin >> N >> K;
vector<int> A(N);
for (int i = 0; i < N; i++){
cin >> A[i];
}
priority_queue<long long, vector<long long>, greater<long long>> pq;
pq.push(0);
int cnt = -1;
long long pr = -1;
while (true){
long long x = pq.top();
pq.pop();
if (pr != x){
pr = x;
cnt++;
if (cnt == K){
cout << x << endl;
break;
}
for (int i = 0; i < N; i++){
pq.push(x + A[i]);
}
}
}
}