XDU暑训2019 Day3 New Year Snowmen

本文介绍了一个基于贪心算法解决雪人问题的C++实现,通过使用map和优先队列来高效地计算出能制作的最大雪人数目及每组雪球的大小。该算法首先对雪球进行排序,然后选取数量最多的雪球,以确保能够尽可能多地制作雪人。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题意:三个不同大小的雪球可以做一个雪人,求最多雪人个数和需要的每组雪球大小
思路:用贪心法,先按照相同的雪球个数对雪球排序,个数最多的先取,因为题目限制大小最多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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值