題目:題目連接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 }