C语言数据结构之猴子分桃问题。
发布网友
发布时间:2022-05-16 20:44
我来回答
共2个回答
热心网友
时间:2024-03-01 22:39
由文件input.txt 给出输入数据。第1 行中有3 个正整数n,k 和m,分别表示有n 只猴
子,每次最多取k个桃到筐中,每只猴子最终都分到m个桃子。
«结果输出:
将分桃过程中每只猴子离开队列的次序依次输出到文件output.txt。
输入文件示例 输出文件示例
input.txt output.txt
5 3 4 1 3 5 2
代码
#include"stdio.h"
#include"malloc.h"
void main()
{
int n,k,m;
int i,j;
int sub=0,p=0,flag=0;
int *queue;
freopen("input.txt", "r", stdin);
freopen("output.txt", "w", stdout);
scanf("%d %d %d",&n,&k,&m);
queue=(int *)malloc(n*sizeof(int));
for(i=0;i<n;i++)
queue[i]=0;
/*sub是用来存放多余的桃子。flag是用来控制循环用的。*/
while(flag<n)
{
for(j=0;j<n;j++)
{
if(queue[j]>=m) /*这只猴子已经领满m个桃子。*/
continue;
else if((queue[j]+p%k+1<m)&&(sub==0))
/*这只猴子还要继续领取他的桃子。*/
{
queue[j]=queue[j]+p%k+1;
p++;
}
else if((sub==0)&&(queue[j]+p%k+1>=m))
/*这只猴子刚领满m个桃子。*/
{
sub=queue[j]+(p%k)+1-m;
queue[j]=m;
p++;
flag++;
printf("%d ",j+1);
}
else if((sub+queue[j]<m)&&(sub!=0))
/*这只猴子还要继续领取他的桃子。*/
{
queue[j]=queue[j]+sub;
sub=0;
}
else if((queue[j]+sub>=m)&&(sub!=0))
/*这只猴子刚领满m个桃子。*/
{
sub=sub+queue[j]-m;
queue[j]=m;
flag++;
printf("%d ",j+1);
}
}
}
}
热心网友
时间:2024-03-01 22:40
#include<iostream>
#include<queue>
using namespace std;
class monkey
{
public:
int id;
int peach;
monkey(int imky)
{
id=imky;
peach=0;
}
monkey(const monkey &mkycopy)
{
id=mkycopy.id;
peach=mkycopy.peach;
}
};
int main()
{
int n,m,k;
cout<<"monkey number:n=";
cin>>n;
cout<<"k=";
cin>>k;
cout<<"m=";
cin>>m;
int ik=1;
bool mkypop=false;
int peachsy=0;
queue<monkey>mky;
for(int i=1;i<=n;++i);
{
monkey*mkynew=new monkey(i);
mky.push(*mkynew);
}
while(ik)
{
monkey mkytemp=mky.front();
if(mkypop==false)
{
mkytemp.peach+=ik;
ik++;
if(ik==k+1)
ik=1;
}
else
mkytemp.peach+=peachsy;
if(mkytemp.peach<m)
{
mkypop=false;
mky.pop();
mky.push(mkytemp);
}
else
{
cout<<mky.front().id;
peachsy=mkytemp.peach-m;
if(peachsy!=0)
mkypop=true;
mkytemp.peach=m;
mky.pop();
// delete &mkytemp;
}
if(mky.empty())
break;
}
cout<<endl;
return 0;
}