F - New Year Snowmen

As meticulous Gerald sets the table and caring Alexander sends the postcards, Sergey makes snowmen. Each showman should consist of three snowballs: a big one, a medium one and a small one. Sergey's twins help him: they've already made n snowballs with radii equal to r1, r2, ..., rn. To make a snowman, one needs any three snowballs whose radii are pairwise different. For example, the balls with radii 1, 2 and 3 can be used to make a snowman but 2, 2, 3 or 2, 2, 2 cannot. Help Sergey and his twins to determine what maximum number of snowmen they can make from those snowballs.

Input

The first line contains integer n (1 ≤ n ≤ 105) — the number of snowballs. The next line contains n integers — the balls' radii r1, r2, ..., rn (1 ≤ ri ≤ 109). The balls' radii can coincide.

Output

Print on the first line a single number k — the maximum number of the snowmen. Next k lines should contain the snowmen's descriptions. The description of each snowman should consist of three space-separated numbers — the big ball's radius, the medium ball's radius and the small ball's radius. It is allowed to print the snowmen in any order. If there are several solutions, print any of them.

Sample 1

Inputcopy Outputcopy
7
1 2 3 4 5 6 7
2
3 2 1
6 5 4

Sample 2

Inputcopy Outputcopy
3
2 2 3
0

题意翻译

现在来做雪人,每个雪人由三个不同大小的雪球构成:一个大的,一个中等的,一个小的。现在有n个雪球半径分别为r1​,r2​,...,rn​为了做雪人,三个雪球的大小必须两两不同。例如,半径分别为 1,2,3 的雪球可以做成雪人,但2,2,3或2,2,2不行。现在需要尽可能做更多雪人。

Input

第一行是一个整数n(1<=n<=10^5)雪球的数量. 接下来有n行整数 — 雪球的半径r1​,r2​,...,rn​(1<=ri​<=10^9)

Output

第一行是一个数kk最大的雪人数. 接下来kk行是每个雪人的描述大雪球的半径,中等雪球的半径,小雪球的半径. 允许按任意顺序输出雪人描述. 如果有多种方案,输出任意一个

#include
#include
#include
#include
#include
#include
#include
using namespace std;
typedef pair pii;

const int N = 1e6 + 10;
mapmm;
priority_queue> heap;  //建立小根堆,存储每个数的值和出现的次数

//定义结构体,s是数字,cnt是出现的次数
struct node {
	int s, cnt;
}a[N];

int b[N][4];

int gf;//gf用于记录不同数字的个数


int main()
{
	std::ios::sync_with_stdio(false);
	cin.tie(0), cout.tie(0);

	int n; scanf_s("%d", &n);
	for (int i = 1; i <= n; i++)
	{
		int num; scanf_s("%d", &num);//读入数据
		//若当前这个数未出现过,这不同数字的个数加一
		if (!mm[num])++gf, mm[num] = gf, a[gf].s = num;
		++a[mm[num]].cnt;
	}

	//将数字放入小根堆中
	for (int i = 1; i <= gf; i++) heap.push(make_pair(a[i].cnt, a[i].s));

	int ans = 0;
	while (heap.size() >= 3)
	{
		//每次取出前三个数
		int cntx = heap.top().first, x = heap.top().second; heap.pop();
		int cnty = heap.top().first, y = heap.top().second; heap.pop();
		int cntz = heap.top().first, z = heap.top().second; heap.pop();

		int temp;
		//进行冒泡排序,从大到小
		if (y < z) temp = z, z = y, y = temp, temp = cntz, cntz = cnty, cnty = temp;
		if (x < z) temp = z, z = x, x = temp, temp = cntz, cntz = cntx, cntx = temp;
		if (x < y) temp = y, y = x, x = temp, temp = cnty, cnty = cntx, cntx = temp;

		//记录到b数组中
		b[++ans][1] = x, b[ans][2] = y, b[ans][3] = z;

		//如果当前的数字还有,则次数减一后再放入小根堆中
		if (cntx > 1) heap.push(make_pair(cntx - 1, x));
		if (cnty > 1) heap.push(make_pair(cnty - 1, y));
		if (cntz > 1) heap.push(make_pair(cntz - 1, z));
	}
	printf("%d\n", ans);
	for (int i = 1; i <= ans; i++) printf("%d %d %d\n", b[i][1], b[i][2], b[i][3]);
}

 

你可能感兴趣的:(算法)