G

题目:题目链接

题意:给出n种食物,食物有自己的价格并且可以自由搭配,每天吃之前没吃过的花费最少的搭配,问第k天的花费。

思路:第k小我们考虑用优先队列处理,虽然n比较大,但由于1 ≤ K ≤ min(106, 2N - 1),只要我们控制好每次往队列里压的的元素个数,问题是可以解决的,控制方法见代码。

AC代码:

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <cstring>
 4 #include <cstdlib>
 5 #include <algorithm>
 6 #include <vector>
 7 #include <string>
 8 #include <set>
 9 #include <map>
10 #include <list>
11 #include <unordered_set>
12 #include <unordered_map>
13 #include <cmath>
14 #include <queue>
15 #include <stack>
16 
17 #define FRER() freopen("in.txt", "r", stdin)
18 #define FREW() freopen("out.txt", "w", stdout)
19 #define INF 0x3f3f3f3f
20 
21 using namespace std;
22 
23 const int maxn = 2e5 + 5;
24 int n, k;
25 
26 long long num[maxn];
27 
28 typedef pair<long long, int> P;
29 
30 int main()
31 {
32     ios::sync_with_stdio(0);
33     cin.tie(0);
34 
35     cin >> n >> k;
36     for(int i = 0; i < n; ++i)
37         cin >> num[i];
38     sort(num, num + n);
39 
40     priority_queue<P, vector<P>, greater<P>> q;
41 
42     q.push(make_pair(num[0], 0));
43     P tmp;
44     for(int i = 1; !q.empty() && i < k; ++i) {
45         tmp = q.top();
46         q.pop();
47 
48         if(tmp.second < n - 1) {
49             q.push(make_pair(tmp.first + num[tmp.second + 1], tmp.second + 1));
50             q.push(make_pair(tmp.first - num[tmp.second] + num[tmp.second + 1], tmp.second + 1));
51         }
52     }
53 
54     cout << q.top().first << endl;
55     return 0;
56 }
原文地址:https://www.cnblogs.com/fan-jiaming/p/10290942.html