题意:
一组数字 找出最多的三个严格单调的数字为一组, 求出最多可以分配多数组?
考虑贪心: 数量越多的数组当然是越先考虑组成,数组动态的改变,用大顶堆进行维护
#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define CLR(a,b) memset(a,(b),sizeof(a))
#define ls st<<1
#define rs st<<1|1
const int INF = 0x3f3f3f3f;
const int MAXN = (int)2e5+10;
const int mod = (int)1e9+7;
struct node {
int k, v;
node(int _v, int _k):v(_v),k(_k){}
bool operator <(const node &r)const {
return k < r.k;
}
};
int arr[MAXN];
map<int, int> mp;
priority_queue<node> que;
int a[MAXN], b[MAXN], c[MAXN];
int main() {
int n, x;
cin >> n;
for (int i = 0; i < n; ++i) {
cin >> x;
mp[x]++;
}
for (auto it = mp.begin(); it != mp.end(); ++it) {
que.push(node(it->first,it->second));
}
if (que.size() < 3) {
cout << "0\n";
return 0;
}
int k = 0, kk = 0;
while (que.size() >= 3) {
node xx = que.top(); que.pop();
node yy = que.top(); que.pop();
node zz = que.top(); que.pop();
a[k] = xx.v, b[k] = yy.v, c[k++] = zz.v;
xx.k--, yy.k--, zz.k--;
if (xx.k) que.push(xx);
if (yy.k) que.push(yy);
if (zz.k) que.push(zz);
}
cout << k << endl;
for (int i = 0; i < k; ++i) {
if(a[i] < b[i]) swap(a[i], b[i]);
if(a[i] < c[i]) swap(a[i], c[i]);
if(b[i] < c[i]) swap(c[i], b[i]);
cout << a[i] << " " << b[i] << " " << c[i] << endl;
}
return 0;
}