死循环了!
if(m-1>0&&(m-1)%5==0&&(m-1)/5!=0)//判断桃子能否合题分配
这句里,之前 m=1,这里始终不能成立,if 不运行,然后就一直循环。。。。
我先说说我对题目的理解:
n只猴子排队拿桃子,每次篮子里放k的阶加(1到k的和,k~)个桃子,在没拿够m个桃子前,猴子们都可以直接拿k~个桃子,当领桃子的猴子手上的桃子加上篮子里的大于等于m的时候,队列里的第一个猴子补满m个并离开队列,如果篮子里还有桃子的话,下一个猴子尝试补满m个,满了就离开队列,不满的话继续去排队。
基于这个理解的前提下,
其实思路方面不复杂:
在获得输入之后,生成两个长度为n的一维数组(直接用二维数组也可以),分别记录“当前各个猴子手上的桃子数”和“离开顺序”(结果),当结果(离开顺序)没填满前,不停的循环执行桃子数的判断:
1、满m个的跳过;
2、加上k~个桃子后超过m的,记为m个,并在结果里面记录当前编号,多于m的个数加到下一个猴子,然后跳过下一个猴子;
3、其他情况直接加上k~个桃子。
两个for循环就OK的事情。
但是有个可以优化的地方:在不满m之前,其实每个猴子都是直接领k~个桃子然后继续排队。也就是说,在第一只猴子手上的桃子加上k~个桃子不够m个的时候,实际就是一直在做“每个猴子给k~个桃子”这一步,而这步对解开题目而言,完全有另一个优化的步骤的。
优化后的伪代码如下:
//定义、描述输出、获取的过程(略)k=(k(k-1)-k); //k的阶加
int [2][n] result=new int[2][n]{0}; //初始化二维数组,有可能样式不对
for(int i=0;i<n;i++) //n只猴子对应在数组里的编号是0到n-1
int[0][i]=(m/k)k //直接赋值“每个猴子已经拿到加上k~个桃子就不少于m的桃子
//(m/k)k这种在自然语言里看来是多余的一步,但在代码里却是关键一步,后面解释
int left=0,j=0;
do
{
for(int i=0;i<n;i++)
{
if(result[0][i]==m)
continue; //拿满m个的猴子跳过处理
left=k;
do
{
if(i>n-1)
i=0; //到第n只猴子后,重新从第1只猴子开始
while(result[0][i]==m)
i+=1; //拿满m个的猴子跳过处理
if(result[0][i]+left>m)
{
left=result[0][i]+left-m;
result[0][i]=m;
i+=1;
result[1][j++]=i;
}
else
{
result[0][i]+=left;
left=0;
}
}while(left>0)
}
}while(j<n) //当结果(离开顺序)没填满前,重新从第1只猴子开始
//输出结果(略)
需要解释的是:(m/k)k这步,在程序中因为是用到整数型参数处理,所以除法的结果是整数的商,也就是把余数抹掉。
PS:写代码的过程中,当想到上面的倒数一步的数量后,发现其实可以在数组内记录余数,然后用减法,记录剩余为0的顺序。不过,在完成代码前这样改思路会延长开发时间,所以最好先完成功能,然后完善。
小猴=2+5=7个
桃子=7×7+2=51个
我们暂且把每只7个看作分到某一轮而这时剩下两个,每只8个,再继续分下一轮,这时还差5个,为什么呢就是因为有7只猴子才到这一轮分的时候差5个,所以猴子是7只,桃子有7×7+2或7×8-5=51个
每只7个剩2个,每只8个差5个如果有了5个,加上原剩的2个,一共是7个;每个小猴增加一个,刚够,说明小猴是7个;那么,桃子就是7×7+2=51个;
8-7=1, 2+5=7,7除以1=7 ,所以最少有7只猴 7×7+2=51,所以最少有51个桃子
以上就是关于C语言枚举问题 猴子分桃全部的内容,包括:C语言枚举问题 猴子分桃、c/c++ 猴子分桃问题、小猴分桃,每只7个剩余2个每只8个差5个,最少有几只小猴最少有多少个桃孑方法或答案.要飞常清楚等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)