1056 Mice and Rice (25) queue的常见用法

本文介绍了一种使用队列进行分组的算法实现,通过记录原始顺序和权重,实现了给定序列的有序分组。文章详细展示了算法的流程,包括输入处理、分组逻辑及输出排序,并提供了完整的C++代码示例。

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

这里需要做一点说明,最开始我没有考虑再设一个mark来进行记录,这样在入队的时候顺序自然就发生了改变,那么就无法以给定顺序做进一步的分组。
分组的时候考虑的是给定序列的问题(第三行)
而输出的时候考虑的是输出重量的顺序(第二行)
同时在考虑到多变量结构体的问题时,类似这样的问题不妨多设变量来实现程序的较好的可读性。

#include<cstdio>
#include<iostream>
#include<vector>
#include<queue>
#include<algorithm>
using namespace std;
struct node
{
	int rank;
	int weight;
	int id;
	int mark;
};
bool cmp(node a,node b)
{
	return a.id<b.id;
}
int main()
{
	int n,ng,id;
	cin>>n>>ng;
	vector<node> ans(n);
	vector<int> w(n);
	for (int i=0;i<n;i++)
	{
		scanf("%d",&w[i]);
	}
	for (int i=0;i<n;i++)
	{
		scanf("%d",&id);
		ans[i].id=id;
		ans[i].weight=w[id];
		ans[i].mark=i;
	}
	queue<node>q;
	for (int i=0;i<n;i++)
	{
		q.push(ans[i]);
	}
	while(!q.empty())
	{
		int size=q.size();
		if(size==1)
		{
			node temp=q.front();
			ans[temp.mark].rank=1;
			break;
		}
		int group;
		if(size%ng==0)
		{
			group=size/ng;
		}
		else
		{
			group=size/ng+1;
		}
		int maxn=-1,cnt=0;
		for(int i=0;i<size;i++)
		{
			node temp=q.front();
			node maxnode;
			q.pop();
			ans[temp.mark].rank=group+1;
		    if(temp.weight>maxn)
		    {
		    	maxnode=temp;
		    	maxn=temp.weight;
			}
			cnt++;
			if(cnt==ng||i==size-1)
			{
				q.push(maxnode);
				cnt=0;
				maxn=-1;
			}
		}
	}
	sort(ans.begin(),ans.end(),cmp);
	for(int i=0;i<n;i++)
	{
		printf("%d",ans[i].rank);
		if(i!=n-1)
            printf(" ");
	}
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值