算法实验题 猴子分桃问题

来源:互联网 发布:java手机 微信 不能用 编辑:程序博客网 时间:2024/05/21 17:03

问题描述:动物园里的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;}


0 0
原创粉丝点击