您的位置:首页 > 其它

算法实验题 猴子分桃问题

2014-03-28 13:17 429 查看
问题描述:动物园里的n只猴子编号为1,2,......n,依次排成一队等待饲养员按规则分桃。动物园的分桃规则是每只猴子可分得m个桃子,但必须排队领取。饲养员循环的每次取出1个,2个,3个.....k个桃子放入筐中,由排在队首的猴子领取。取到筐中的桃子数为K后,又重新从1开始。当筐中桃子数加上队首猴子已经取得的桃子数不超过m时,队首的猴子可以全部取出筐中桃子。取得的桃子总数不足m个的猴子,继续到队尾排队等候。当筐中桃子数加上队首猴子已经取得的桃子数超过m时,队首的猴子只能取满m个,然后离开队列,筐中剩余的桃子由下一只猴子取出。上述分桃过程一直进行到每只猴子都分到m个桃子

实验任务:对于给定的n,k,m模拟上述猴子分桃过程。

数据输入:n,k,m分别表示猴子数,每次最多取k个桃子到筐中,每只猴子最终都分到m个桃子。

输出结果:将分桃过程中每只猴子离开队列的次序依次输出。

input:

5 3 4

output:

1 3 5 2 4



解题思想:可以用队列的性质模拟这个过程,本程序使用的是C++中的STL,可以直接使用队列而不必进行复杂的定义等等。首先对队列中的猴子进行编号。然后创建一个数组存储对应的猴子取得的桃子数,并初始化为0,每次模拟取桃子这个过程,直到队列中的猴子数为0,则表明所有的猴子都取到了m个桃子。详细见代码:

c++代码:

#include<iostream>
#include<queue>//使用STL的queue,方便操作
using namespace std;
int a[100];
int bz[100];
int main()
{
	int i,n,k,m,t,tt,j = 0;
	cin>>n>>k>>m;  //输入 
	queue<int> monkey;
	for( i=1;i<=n;i++)
	{
		monkey.push(i); //将每只猴子编号,从1开始到n 
		a[i] = 0;//初始化每只猴子取得的桃子数 
	}
	cout<<"number of monkey :"<<monkey.size()<<endl;//输出猴子总数 
		t=1;//第一次取1个桃子到筐中,以后依次加1 
		tt=0;
		while(t<=k&&!monkey.empty())  //当还有猴子在队列中的时候继续取桃子 
		{
			if(tt)//当上一只猴子取得m个桃子,筐中还剩下tt个桃子,则由本只猴子取得,饲养员此时不放桃子 
			{
			//	tt+=t;
				a[monkey.front()]+=tt;  //取得框中所有剩余的桃子 
				if(a[monkey.front()]>=m)//判断是否超过m个 
			{
				bz[j++] = monkey.front();//记录退出队列的猴子的编号 
				tt=a[monkey.front()]-m;//超过的话则取走m个,剩下tt个由下一只猴子取得 
				monkey.pop();//取满m个桃子的猴子退出队列 
			
				
				
			}
			else{
				  	monkey.push(monkey.front());//不超过m个则继续到队尾排队 
					monkey.pop();//队首删除 
					tt= 0;//剩余为0 
					
			}
			if(t==1)   //本次本来应该投放1个桃子,但原本就有剩余,所以留到下次放 
                    t=k;
            else t=t-1; //后面有执行t++,所以这里t=t-1,则下次还是为t 
			}

			//框中没有剩余时 
			else
			{
				a[monkey.front()]+=t;//取得桃子 
				if(a[monkey.front()]>=m)//如果大于m,则取走m,框中留下tt个,同时这只猴子要退出队列 
			{
				bz[j++] = monkey.front();//记录退出队列的猴子的编号 
				tt=a[monkey.front()]-m;
				monkey.pop();
				
			}
			else{
				  	monkey.push(monkey.front());//否则继续在队尾排队 
					monkey.pop();
			}
			}
			//
			if(t==k)//当分完k个时,下次继续从1开始分 
				t=1;
			else t++;
		}
	cout<<"number of monkey :"<<monkey.size()<<endl;//队列中应该是0只猴子,如果全部分配完的话 
	for(i=0;i<j;i++)  //输出 
		cout<<bz[i]<<' ';

	return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: