1. 程式人生 > >藍橋杯——分糖果

藍橋杯——分糖果

問題描述  有n個小朋友圍坐成一圈。老師給每個小朋友隨機發偶數個糖果,然後進行下面的遊戲:  每個小朋友都把自己的糖果分一半給左手邊的孩子。  一輪分糖後,擁有奇數顆糖的孩子由老師補給1個糖果,從而變成偶數。  反覆進行這個遊戲,直到所有小朋友的糖果數都相同為止。  你的任務是預測在已知的初始糖果情形下,老師一共需要補發多少個糖果。輸入格式  程式首先讀入一個整數N(2<N<100),表示小朋友的人數。  接著是一行用空格分開的N個偶數(每個偶數不大於1000,不小於2)輸出格式  要求程式輸出一個整數,表示老師需要補發的糖果數。樣例輸入32 2 4樣例輸出4值得注意的是,在傳遞糖果時,所有的小盆友是同時進行的。在用程式模擬的時候,需要用迴圈。為了避免前一次傳遞影響下一次傳遞,迴圈必須從第一個開始,即先修改第一個小朋友的糖果數,再修改第二個,依次類推。此外,還要事先儲存第一個小朋友的糖果的數目,這樣即使在第一個小朋友的糖果數改變了之後,還能知道應該給最後一個小朋友的糖果的數目。

舉個例子:比如有四個小朋友,開始時他們的糖果數是a,b,c,d.一輪分糖果之後,他們的糖果數變成了:(a+b)/2,(b+c)/2,(c+d)/2,(d+a)/2。然後老師給奇數個糖果的小朋友一個糖果,以此類推,直到所有小朋友的糖果數一樣,則結束。

#include<stdio.h>
#define MAXN 110
int a[MAXN];

int main()
{
	int n,i,count=0;
	scanf("%d",&n);
	for(i=0;i<n;i++)
	{
		scanf("%d",&a[i]);
	}
	while(1)
	{
		//檢查所有小朋友的糖果數是否相等
		for(i=1;i<n;i++)
		{
			if(a[i]!=a[0])
				break;
		}
		if(i==n)
			break;
		//每個小朋友都把自己的糖果分一半給左手邊的孩子
		int num=a[0];
		for(i=0;i<n-1;i++)
		{
			a[i]=(a[i]+a[i+1])/2;
		}
		a[i]=(a[i]+num)/2;
		//一輪分糖後,擁有奇數顆糖的孩子由老師補給1個糖果,從而變成偶數。
		for(i=0;i<n;i++)
		{
			if(a[i]%2!=0)
			{
				a[i]++;
				count++;
			}
		}
	}
	printf("%d\n",count);
	return 0;
}