栈的应用------PAT_A1056 Mice and Rice

原题

1056 Mice and Rice (25 分)
翻译:Mice和Rice是编程竞赛的名称,在竞赛中,每个程序员必须编写一段代码来控制给定地图中老鼠的移动。每只老鼠的目标是吃尽可能多的米饭,以便成为肥老鼠。
首先NP个程序员随机决定游戏顺序。然后每NG个程序员被分在一组。一组中最胖的老鼠获胜并进入下一轮。所有输家的排名都一样。胜利者在下一场比赛中每NG人一组,直到最后一个胜利者被确定。
为了简单起见,假设程序员提交代码后,每个老鼠的重量是固定的。给定所有鼠标的重量和初始游戏顺序,您应该为程序员输出等级。

输入样例

11 3(NP NG)

25 18 0 46 37 3 19 22 57 56 10(每只老鼠质量,编号依次为 0 ~ NP-1 )

6 0 8 7 10 5 9 1 4 2 3( 初始游戏顺序 ,数字表示老鼠编号 )

输出样例

5 5 5 2 5 5 5 3 1 3 5

每个数字间空格隔开,最后一个数字后面没有空格

题意

给出NP只老鼠,并按规定的顺序每NG个一组,每组中最重的老鼠晋级下一轮,直到只有一直最重的老鼠,排名为1.把这些老鼠的排名按原来的输入顺序输出。

代码

#include<cstdio>
#include<queue>
using namespace std;
#define maxn 1010

struct mouse {
	int weight;
	int r;
}mouse[maxn];  //数组与结构体结合

int main()
{
	int np, ng, order;
	scanf ("%d%d", &np, &ng);//第一行输入np, ng
	for ( int i = 0; i < np; i++ ){//第二行输入weight
		scanf ( "%d", &mouse[ i ].weight );
	}
	queue < int > q;//游戏顺序存入队列
	for ( int i = 0; i < np; i++ ){
		scanf("%d", &order);
		q.push(order); 
	} 
	 
	int temp = np, group;//temp记录队列中元素数量
	while ( q.size() != 1){
		//分组
		if ( temp % ng == 0 ) group = temp / ng;
		else group = temp / ng + 1;
		
		//遍历每组,遍历次数是组数group
		for ( int i = 0; i < group; i++ ){
			int k = q.front() ;
			//找出每组中最大的老鼠,遍历次数是组成员数ng
			for ( int j = 0; j < ng; j++ ){
				if ( i*ng+j >= temp ) break;//计算是第几只老鼠,超过每组个数,出循环
				int front = q.front() ;
				if ( mouse[front].weight > mouse[k].weight )
					k = front;
				mouse[front].r = group + 1;//每轮名次是总组数加一
				q.pop() ;//判断完就出队
			}
			q.push(k); //晋级的从队尾入队,不影响
		}
		temp = group;//下一轮队列中元素个数是这一轮的组数
	}
	mouse[q.front()].r = 1;//队列只剩一个元素,令其排名为1
	
	for ( int i = 0; i < np; i++ ){
		printf("%d", mouse[ i ].r );//数组中老鼠的顺序没动,只有其排名变了
		if ( i < np - 1 )
			printf(" ");//最后一个输出后没有空格
	}
	return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值