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

InputcopyOutputcopy
7
1 2 3 4 5 6 7
2
3 2 1
6 5 4

Sample 2

InputcopyOutputcopy
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<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<map>
#include<queue>
using namespace std;
typedef pair<int, int> pii;

const int N = 1e6 + 10;
map<int, int>mm;
priority_queue<pair<int, int>> 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]);
}

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值