G - Dreamoon and NightMarket Gym - 101234G 优先队列+思路
题目:题目链接
题意:给出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 }
版权声明:该博客版权归本人所有,若有意转载,请与本人联系