PAT A1056 Mice an Rice

本文介绍了一种通过模拟比赛过程来确定老鼠赛跑排名的算法。利用队列数据结构存储参赛老鼠的序号,每轮比赛淘汰除最强者外的所有老鼠,直至决出冠军。详细解析了算法的实现细节及核心代码。
//参考晴天。。。 
//是否需要开一个队列数组
//并不需要,仔细想想队列的特性,先进先出,有利于一整轮的处理后再一整轮的处理 
#include<cstdio>
#include<queue>
//#define LOCAL
using namespace std;

struct Mice{
	int weight;
	int rank;
}mice[1010];

queue<int> qu;//队列是int,存放序号即可.更不需要队列数组!  

int main(){
	#ifdef LOCAL
	freopen("A1056data.in","r",stdin);
	freopen("A1056data.out","w",stdout);
	#endif
	int np,ng,order;
	scanf("%d%d",&np,&ng);
	for(int i=0;i<np;i++){
		scanf("%d",&mice[i].weight);
	}
	for(int i=0;i<np;i++){
		scanf("%d",&order);//按顺序将老鼠的标号入队
		qu.push(order); 
	}
	int temp=np,group;//temp为当前轮的比赛老鼠总数,group为组数
	//三重循环,要好好理解 
	while(qu.size()!=1){//注意这里不能写size!=0.否则,group会为1,这唯一一个mice的排名会为2 
		//计算group.即当前轮分为几组
		if(temp%ng==0){
			group=temp/ng;
		} 
		else{
			group=temp/ng+1;
		}
		for(int i=0;i<group;i++){//恩这里上界确实是group,表示需要几组的比拼 
			int k=qu.front();
			for(int j=0;j<ng;j++){
				if(i*ng+j>=temp) break;//这将在最后一轮老鼠数量小ng时起作用
				int front=qu.front();//队首老鼠编号 
				if(mice[front].weight>mice[k].weight){
					k=front;
				}
				//不论是不是比第一个大,都要弹出。如果大,就把序号记录下来 
				mice[front].rank=group+1;//注意这里的排名赋值。这一轮结束后,会有group个老鼠晋级,所以这一轮刷下来的都是group+1名 
				qu.pop();//出队这只老鼠 
			}
			qu.push(k);//把这只老鼠入队,下一轮处理 
		}
		temp=group;//group只老鼠晋级,所以老鼠数目变为group 
	}
	mice[qu.front()].rank=1;//这个1一定要出来赋值
	for(int i=0;i<np;i++){
		printf("%d",mice[i].rank);
		if(i!=np-1) printf(" ");
	} 
	return 0;
} 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值