PAT 1056 Mice and Rice


这一题的大意是说Np个老鼠参加比赛,相邻Ng个分成一组进行选拔,每组中选择最重的老鼠晋级,没有晋级的老鼠的排名一个样,按照这种思路给所有的老鼠进行排名,如果最后剩下不足Ng个仍可以分成一组,排名是跟分组个数相关。

这一题最开始我不理解的就是怎么确定排名,后来才明白,先算出当前的组数,然后排名等于组数+1,用测试样例验证是符合的。我们可以采用队列按照题目要求的顺序来保存老鼠的体重和索引,然后对一个个出队,在出队的过程中,我们找最大的体重和与之对应的索引,同时给老鼠排名,每Ng个我们把这Ng个中最重的老师,保存到一个新的队列中,这样遍历完一轮队列,就可以把所有的晋级的老师放入新的队列中,当当前队列为空之后,我们可以把新队列中的晋级的老鼠再赋值回去。循环往复即可。

完整代码如下:

cpp 复制代码
#include<bits/stdc++.h>
#include<iostream> 
using namespace std;
//每个老鼠的目标是尽可能的吃的多去成为一个胖老鼠// 玩的顺序是随机的对应Np个人来说
// 每NG个程序员组成一个队伍
// 最胖的老鼠进入下一个顺序
// 所由的失败者是相同的排名
// Ng个赢家再组成一个队伍去找最后的赢家
//给出体重和最初的排序 
int Np;
int Ng;
struct node
{
	int w;
	int order;
}n[1005];
int ans[1005];
int order[1005];
bool flag;
queue<node> q;

int main()
{
    cin>>Np>>Ng;
    for(int i=0;i<Np;i++)
    {
    	int x;
    	cin>>x;
    	n[i].w=x;
	}
	 for(int i=0;i<Np;i++)
    {
    	int x;
    	cin>>x;
    	order[i]=x;
        n[x].order=x;
	}
	 for(int i=0;i<Np;i++)
    {
    	q.push(n[order[i]]); 
	}
	
	int group;
	if(Np%Ng==0)
	{
		group=Np/Ng;
	}
	else
	{
		group=Np/Ng+1;
	}

	int index=0;
	int cnt=0;
	int maxx=0;
//	cout<<group<<endl;
	queue<node> temp;

	
	while(!q.empty())
	{
		node cur=q.front();
		//cout<<cur.order<<endl;
		q.pop();
		ans[cur.order]=group+1;
		cnt++;
		if(cur.w>maxx)
		{
			maxx=cur.w;
			index=cur.order;
		}
		if(cnt==Ng)
		{
			temp.push(n[index]);
			cnt=0;
			maxx=0;
			index=0;
		}
		if(q.empty()&&cnt>0)
		{
			temp.push(n[index]);
			cnt=0;
			maxx=0;
			index=0;
			int groupnumber=temp.size();
			if(groupnumber%Ng==0)
			{
				group=groupnumber/Ng;
			}
			else
			{
				group=groupnumber/Ng+1;
			}
		}
		if(q.empty())
		{
			//说明刚好正分 
			q=temp;
			int groupnumber=temp.size();
			if(groupnumber%Ng==0)
			{
				group=groupnumber/Ng;
			}
			else
			{
				group=groupnumber/Ng+1;
			}
			while(!temp.empty())
			{
				temp.pop();
			}
		    if(q.size()==1)
			{
				ans[q.front().order]=1;
				break;
			}
			
			
		}
    }
	for(int i=0;i<Np;i++)
	{
		if(i==0)
		{
			cout<<ans[i];
		}
		else
		{
			cout<<" "<<ans[i];
		}
	}
	
    return 0;
}

总结:这一题是队列模拟,只要弄清楚题意,按逻辑模拟即可

相关推荐
过河卒_zh15667666 小时前
情感型AI被“立规矩”,AI陪伴时代进入下半场
人工智能·算法·aigc·生成式人工智能·算法备案
wefg16 小时前
【算法】动态规划
算法·动态规划
机器学习之心7 小时前
198种组合算法+优化TCN-Transformer+SHAP分析+新数据预测+多输出!深度学习可解释分析,强烈安利,粉丝必备!
深度学习·算法·transformer·shap分析·新数据预测
狐577 小时前
2026-01-12-LeetCode刷题笔记-1266-访问所有点的最小时间.md
笔记·算法·leetcode
Gorgous—l7 小时前
数据结构算法学习:LeetCode热题100-栈篇(有效的括号、最小栈、字符串解码、每日温度、柱状图中最大的矩形)
数据结构·学习·算法
小郭团队7 小时前
教育公平的探索
大数据·人工智能·嵌入式硬件·算法·硬件架构
瑞雨溪7 小时前
力扣题解:740.删除并获得点数
算法·leetcode·职场和发展
LeeeX!7 小时前
基于YOLO11实现明厨亮灶系统实时检测【多场景数据+模型训练、推理、导出】
深度学习·算法·目标检测·数据集·明厨亮灶
红队it7 小时前
【Spark+Hadoop】基于spark+hadoop游戏评论数据分析可视化大屏(完整系统源码+数据库+开发笔记+详细部署教程+虚拟机分布式启动教程)✅
大数据·hadoop·分布式·算法·游戏·数据分析·spark
程序员-King.7 小时前
day125—二分查找—寻找峰值(LeetCode-162)
算法·leetcode·职场和发展