G - Dreamoon and NightMarket Gym - 101234G 優先隊列+思路

題目:題目連接ios

題意:給出n種食物,食物有本身的價格而且能夠自由搭配,天天吃以前沒吃過的花費最少的搭配,問第k天的花費。spa

思路:第k小咱們考慮用優先隊列處理,雖然n比較大,但因爲1 ≤ K ≤ min(106, 2N - 1),只要咱們控制好每次往隊列裏壓的的元素個數,問題是能夠解決的,控制方法見代碼。.net

AC代碼:code

 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 }
相關文章
相關標籤/搜索