题意:三个不同大小的雪球可以做一个雪人,求最多雪人个数和需要的每组雪球大小
思路:用贪心法,先按照相同的雪球个数对雪球排序,个数最多的先取,因为题目限制大小最多1e9,故用map,取最多个数雪球用堆来求,否则会超时,重载的比较是关键,暂时不知道为啥这样就可以过
#include<bits/stdc++.h>
using namespace std;
int n;
struct cmp
{
bool operator()(pair<long long, long long> a,pair<long long, long long> b)
{
if (a.second != b.second)
return a.second < b.second;
else
return a.first < b.first;
}
};
int main()
{
while (cin >> n) {
map<long long, long long> m;
priority_queue<pair<long long, long long>, vector<pair<long long, long long> >, cmp> q;
vector<long long> ans[3];
for (int i = 0; i < n; i++) {
int k;
cin >> k;
m[k]++;
}
map<long long, long long>::iterator it = m.begin();
for (; it != m.end(); it++)
q.push(make_pair(it->first, it->second));
while (q.size() >= 3) {
pair<long long, long long> a = q.top(); q.pop();
pair<long long, long long> b = q.top(); q.pop();
pair<long long, long long> c = q.top(); q.pop();
ans[0].push_back(a.first);
ans[1].push_back(b.first);
ans[2].push_back(c.first);
a.second--;
b.second--;
c.second--;
if (a.second > 0)
q.push(a);
if (b.second > 0)
q.push(b);
if (c.second > 0)
q.push(c);
}
printf("%d\n", ans[0].size());
for (int i = 0; i < ans[0].size(); i++) {
long long a = ans[0][i], b = ans[1][i], c = ans[2][i];
if (b > a) {
long long t = b;
b = a;
a = t;
}
if (c > a) {
long long t = c;
c = a;
a = t;
}
if (c > b) {
long long t = c;
c = b;
b = t;
}
printf("%lld %lld %lld\n", a, b, c);
}
}
return 0;
}