CF1579D-Productive Meeting
题目大意:一共有n个人,每个人都可以和其他人进行若干次一对一的谈话,第i个人可以谈话ai次,问所有人最终总共能有多少次谈话,并输出谈话方案。
考虑下面这个案例
如果一直让第一个人跟第二个人谈话,最终的谈话只有两次。而最多的谈话却能有3次,下面是一种方案
如果一直让第一个人跟第二个人谈话,第三个人的谈话次数最终都生下来,浪费掉了。上述方法充分使用到每一个人的剩余次数,减少了浪费,增加了最终总的谈话数。
如何尽量减少浪费?可以每次取剩余次数最大的两个人,让他们谈话。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41
| #include <bits/stdc++.h> using namespace std; int main() { int n, i, j, a, _; scanf("%d", &_); while (_--) { scanf("%d", &n); priority_queue<pair<int, int>> pq; for (i = 1; i <= n; i++) { scanf("%d", &a); if (a > 0) pq.push(make_pair(a, i)); } queue<pair<int, int>> res; pair<int, int> p; while (pq.size() > 1) { p.first = pq.top().second; i = pq.top().first; pq.pop(); p.second = pq.top().second; j = pq.top().first; pq.pop(); res.push(p); if (--i) pq.push(make_pair(i, p.first)); if (--j) pq.push(make_pair(j, p.second)); } printf("%d\n", res.size()); while (!res.empty()) { printf("%d %d\n", res.front().first, res.front().second); res.pop(); } } return 0; }
|