正题
题目链接:https://www.luogu.com.cn/problem/CF140C
题目大意
nnn个雪球,一个雪人需要用333个不同大小的雪球堆起,求最多雪人。
解题思路
我们每次拿相同雪球中最多的三个来堆即可,用优先队列维护。
时间复杂度O(nlogn)O(n\log n)O(nlogn)
codecodecode
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
#define mp(x,y) make_pair(x,y)
using namespace std;
const int N=1e5+10;
int n,a[N],ans,b1[N],b2[N],b3[N];
priority_queue<pair<int,int> > q;
int main()
{scanf("%d",&n);for(int i=1;i<=n;i++)scanf("%d",&a[i]);sort(a+1,a+1+n);int cnt=0;for(int i=1;i<=n;i++){cnt++;if(a[i]!=a[i+1])q.push(mp(cnt,a[i])),cnt=0;}while(1){if(q.empty())break;pair<int,int> x=q.top();q.pop();if(q.empty())break;pair<int,int> y=q.top();q.pop();if(q.empty())break;pair<int,int> z=q.top();q.pop();ans++;b1[ans]=x.second;b2[ans]=y.second;b3[ans]=z.second;if(x.first>1)q.push(mp(x.first-1,x.second));if(y.first>1)q.push(mp(y.first-1,y.second));if(z.first>1)q.push(mp(z.first-1,z.second));}printf("%d\n",ans);for(int i=1;i<=ans;i++){if(b1[i]<b2[i])swap(b1[i],b2[i]);if(b1[i]<b3[i])swap(b1[i],b3[i]);if(b2[i]<b3[i])swap(b2[i],b3[i]);printf("%d %d %d\n",b1[i],b2[i],b3[i]);}return 0;
}