C. New Year Snowmen --优先队列

要求一堆雪球选出半径完全不同的三个即可做成一个雪人 

看最多能做多少个雪人

先把雪球半径和对应个数统计好 打包(结构体)   进入优先队列(数量优先)

每次pop出前三个,

记录好,分别把对应雪球的个数减一(结构体)  , 若个数为零,丢弃,否则继续进入队列

直到queue.size<3



#include <cstdio>
#include <cmath>
#include <cstring>
#include <string>
#include <queue>
#include <algorithm>
#include <iostream>
using namespace std;
int ans[100000+5][3]; 
int vis[100000+5]; 
struct node
{
	int num,x;
 
	bool operator <(  node b)  const
    {    
		
	  		return num<b.num;  ///重载为 数量大优先
    }    
};
priority_queue<node> qq;//使用默认优先级比较符号<
int cmp(int a ,int b)
{
	return a>b;			//降序
}
int cmp2(node a ,node b)
{
	return a.x>b.x;			//升序
}

 
int main()
{
	int n;
	cin>>n;
	int t;
	int i;
	for (i=1;i<=n;i++)
	{
		scanf("%d",&t);
		vis[i]=t;
	}
	sort(vis+1,vis+1+n,cmp);

	for (i=1;i<=n;i++)
	{
		int cun=1;
		while(vis[i]==vis[i+1]&&i<=n)
		{
			cun++;
			i++;
		}
		node t;
		t.num=cun;
		t.x=vis[i];
		qq.push(t);     //得到重复的个数 及该 数值  进入优先队列
	}
  
	int ok=0;
	while(qq.size()>=3)     //不同的雪球种类>=3
	{
		node q[4];
		q[1].x=q[2].x=q[3].x=0;      
			q[1]=qq.top(),qq.pop(); //取出前三大,复杂度logn
			q[2]=qq.top(),qq.pop(); 
			q[3]=qq.top(),qq.pop();
sort(q+1,1+q+3,cmp2);			//把雪球的半径排序,升序
	 
			ans[++ok][0]=q[1].x;	//记录答案
			ans[ok][1]=q[2].x;
			ans[ok][2]=q[3].x;
 

		q[1].num--;q[2].num--;q[3].num--;    //数量减一

		if(q[1].num)					//若个数为零,丢弃,否则继续进入队列
			qq.push(q[1]);
		if (q[2].num)
			qq.push(q[2]);
		if (q[3].num)
			qq.push(q[3]);
		
	}
	printf("%d\n",ok);
	for (i=1;i<=ok;i++)
	{
		printf("%d %d %d\n",ans[i][0],ans[i][1],ans[i][2]);
	}
	
	
	
	return 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值