[Codeforces 140C] New Year Snowmen
[题目链接]
https://codeforces.com/problemset/problem/140/C
[算法]
显然 , 我们每次应优先考虑数量多的雪球
将雪球个数加入堆中 , 每次取出数量前三大的雪球 , 贪心地将它们分到一个组中即可
时间复杂度 : O(N log N)
[代码]
#include<bits/stdc++.h> using namespace std; const int MAXN = 1e5 + 10; struct info { int v1 , v2 , v3; } ans[MAXN]; int n , tot; int r[MAXN]; map< int,int > mp; priority_queue< pair<int,int> > q; template <typename T> inline void read(T &x) { T f = 1; x = 0; char c = getchar(); for (; !isdigit(c); c = getchar()) if (c == '-') f = -f; for (; isdigit(c); c = getchar()) x = (x << 3) + (x << 1) + c - '0'; x *= f; } int main() { read(n); for (int i = 1; i <= n; i++) { read(r[i]); mp[r[i]]++; } for (map< int,int > :: iterator it = mp.begin(); it != mp.end(); it++) q.push(make_pair(it -> second,it -> first)); while ((int)q.size() >= 3) { pair<int,int> a = q.top(); q.pop(); pair<int,int> b = q.top(); q.pop(); pair<int,int> c = q.top(); q.pop(); ans[++tot] = (info){a.second,b.second,c.second}; if (a.first > 1) q.push(make_pair(a.first - 1,a.second)); if (b.first > 1) q.push(make_pair(b.first - 1,b.second)); if (c.first > 1) q.push(make_pair(c.first - 1,c.second)); } printf("%d\n",tot); for (int i = 1; i <= tot; i++) { if (ans[i].v1 < ans[i].v2) swap(ans[i].v1,ans[i].v2); if (ans[i].v1 < ans[i].v3) swap(ans[i].v1,ans[i].v3); if (ans[i].v2 < ans[i].v3) swap(ans[i].v2,ans[i].v3); printf("%d %d %d\n",ans[i].v1,ans[i].v2,ans[i].v3); } return 0; }
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步