C语言编程 吃糖果的问题 难!!!!

Python014

C语言编程 吃糖果的问题 难!!!!,第1张

只有在T组糖果中,当任意的某一种糖果的数量 - 剩余T-1种糖果的数量之和 ≥ 2的情况下,才不可能吃完。其他任何情况下都可以吃完。

证明: 设糖果有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])

}