感觉是个贪心 贪心策略就是每次选剩下个数最多的三个数 就是连续取最大堆三个堆顶

#include <bits/stdc++.h>
using namespace std;

struct node
{
friend bool operator < (node n1,node n2)
{
return n1.val<n2.val;
}
int id;
int val;
};

priority_queue <node> que;
map <int,int> mp;
int ans[100010][3];
int num[100010];
int n;

int cmp(int u,int v)
{
return u>v;
}

int main()
{
node cur0,cur1,cur2,tem;
int i,j,p;
while(scanf("%d",&n)!=EOF)
{
mp.clear();
for(i=1;i<=n;i++)
{
scanf("%d",&num[i]);
mp[num[i]]++;
}
sort(num+1,num+n+1,cmp);
for(i=1,j=0;i<=n;i++)
{
if(num[i]!=num[j])
{
num[++j]=num[i];
}
}
while(!que.empty()) que.pop();
n=j;
for(i=1;i<=n;i++)
{
tem.id=num[i];
tem.val=mp[num[i]];
que.push(tem);
}
p=0;
while(!que.empty())
{
cur0=que.top();
que.pop();
if(!que.empty())
{
cur1=que.top();
que.pop();
}
else break;
if(!que.empty())
{
cur2=que.top();
que.pop();
}
else break;
p++;
ans[p][0]=cur0.id,ans[p][1]=cur1.id,ans[p][2]=cur2.id;
sort(ans[p],ans[p]+3,cmp);
cur0.val--,cur1.val--,cur2.val--;
if(cur0.val>0) que.push(cur0);
if(cur1.val>0) que.push(cur1);
if(cur2.val>0) que.push(cur2);
}
printf("%d\n",p);
for(i=1;i<=p;i++)
{
printf("%d %d %d\n",ans[i][0],ans[i][1],ans[i][2]);
}
}
return 0;
}