证明: 设糖果有T种, 每一种有X1,X2,X3,......XT 个。
步骤一: 取X1,X2,X3........XT 中最小值Xmin。(即标准地每种吃一个,直到把最少的那一组吃完)
那么接下来剩余的糖果种类为T - 1。每一种有X1-Xmin1,X2-Xmin1,X3-Xmin1.......XT-Xmin1 个
步骤二:在剩余的T-1种糖果中,找出数量最少的。(即X1-Xmin,X2-Xmin.......XT-Xmin中最少的)
那么剩余的糖果种类为T-2,每一种有X1-Xmin1-Xmin2,X2-Xmin1-Xmin2.......XT-Xmin1-Xmin2个
重复以上步骤直到最后只剩一种糖果,这个糖果的数量为,Xmax - Xmin1- Xmin2 - Xmin3 ....- Xmin(T-1)
当这个糖果的数量为0的情况下,就可以吃完。不为0的情况下就不可以吃完。
考虑最差情况,即每一次只吃最多的一种糖果和最少的一种糖果。(每次吃2种,其他糖果不吃)
那么最后剩余糖果的数量为 Xmax - X1-X2 -X3 ....-XT
当这个值为1时 则可以吃完。大于1时 则吃不完。
接下来编程就非常容易了。
遍历一遍T组糖果中每种糖果的数量,然后算一下就行了。
都已经回复过了,怎么还在重复发贴啊~~#include<stdio.h>
int
equal(int
child[])//判断每个小孩手上的糖是否相等
{
int
i
for(i=1i<10i++)
if(child[i]!=child[i-1])
return
1
return
0
}
void
main()
{
int
child[10]={10,2,8,22,16,4,10,6,14,20}
int
i,
tmp0,
tmp,
sum=0,
count=1
while(equal(child))
{
tmp0=
child[0]
for(i=1i<10i++)
{//循环分糖
if(child[i]%2)
child[i]++
tmp
=
child[i]
child[i-1]=child[i-1]/2+tmp/2//分糖后
}
if(tmp0%2)
tmp0++
child[9]=child[9]/2+tmp0/2
count++
}
printf("经过%d次后,大家手上都有%d块糖.\n",
count,
child[0])
}