【CF140C】New Year Snowmen
阿新 • • 發佈:2020-10-23
題目
題目連結:https://codeforces.com/problemset/problem/140/C
現在來做雪人,每個雪人由三個不同大小的雪球構成:一個大的,一箇中等的,一個小的。現在有\(n\)個雪球半徑分別為\(r_1, r_2, ..., r_n\)為了做雪人,三個雪球的大小必須兩兩不同。例如,半徑分別為 \(1,2,3\) 的雪球可以做成雪人,但\(2,2,3\)或\(2,2,2\)不行。現在需要儘可能做更多雪人。
思路
容易發現每次肯定是將最多的三個雪球拿出來。因為如果此時不拿最多的雪球,要麼最後會剩餘很多這種雪球,要麼最終依然會使用這些雪球,所以可以先使用最多的。
優先佇列維護即可。時間複雜度 \(O(n\log n)\)
程式碼
#include <bits/stdc++.h> #define mp make_pair using namespace std; const int N=100010; int n,m,ans[N][3]; map<int,int> cnt; priority_queue<pair<int,int> > q; int main() { scanf("%d",&n); for (int i=1,x;i<=n;i++) { scanf("%d",&x); cnt[x]++; } for (map<int,int>::iterator it=cnt.begin();it!=cnt.end();it++) q.push(mp((*it).second,(*it).first)); while (q.size()>=3) { m++; 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[m][0]=a.second; a.first--; ans[m][1]=b.second; b.first--; ans[m][2]=c.second; c.first--; if (a.first) q.push(a); if (b.first) q.push(b); if (c.first) q.push(c); } printf("%d\n",m); for (int i=1;i<=m;i++) { sort(ans[i],ans[i]+3); printf("%d %d %d\n",ans[i][2],ans[i][1],ans[i][0]); } return 0; }