題目鏈接:點擊打開鏈接 分糖果
問題描述
有n個小朋友圍坐成一圈。老師給每個小朋友隨機發偶數個糖果,然後進行下面的遊戲:
每個小朋友都把自己的糖果分一半給左手邊的孩子。
一輪分糖後,擁有奇數顆糖的孩子由老師補給1個糖果,從而變成偶數。
反覆進行這個遊戲,直到所有小朋友的糖果數都相同爲止。
你的任務是預測在已知的初始糖果情形下,老師一共需要補發多少個糖果。
每個小朋友都把自己的糖果分一半給左手邊的孩子。
一輪分糖後,擁有奇數顆糖的孩子由老師補給1個糖果,從而變成偶數。
反覆進行這個遊戲,直到所有小朋友的糖果數都相同爲止。
你的任務是預測在已知的初始糖果情形下,老師一共需要補發多少個糖果。
輸入格式
程序首先讀入一個整數N(2<N<100),表示小朋友的人數。
接着是一行用空格分開的N個偶數(每個偶數不大於1000,不小於2)
接着是一行用空格分開的N個偶數(每個偶數不大於1000,不小於2)
輸出格式
要求程序輸出一個整數,表示老師需要補發的糖果數。
樣例輸入
3
2 2 4
2 2 4
樣例輸出
4
#include<cstdio>
#include<iostream>
using namespace std;
int sum=0;
int n;
int a[1005];
int main()
{
while(cin>>n)
{
for(int i=1; i<=n; i++)
{
cin>>a[i];
}
for(int m=1; m<=100; m++)
{
int cnt=a[1];
for(int i=1; i<n; i++)
{
a[i]=a[i]+(a[i+1]/2);
//cout<<"a["<<i<<"]="<<a[i]<<endl;
a[i+1]=a[i+1]/2;
//cout<<"a["<<i+1<<"]="<<a[i+1]<<endl;
}
a[n]=a[n]+cnt/2;
//cout<<"a["<<n<<"]="<<a[n]<<endl;
a[1]=a[1]-(cnt/2);
// cout<<"a["<<1<<"]="<<a[1]<<endl;
for(int i=1; i<=n; i++)
{
if(a[i]%2!=0)
{
a[i]++;
//cout<<"a[i]%2!=0-->a["<<i<<"]="<<a[i]<<endl;
sum++;
//cout<<"sum="<<sum<<endl;
}
}
int s=0;
for(int i=1; i<n; i++)
{
if(a[i]==a[i+1])
{
s++;
//cout<<"s="<<s<<endl;
}
}
if(s==n-1)
{
break;
}
}
cout<<sum<<endl;
}
return 0;
}
就是組成了一個圈,每個人 把他的糖果的一半給他左面的人,別忘了最後一個人的糖果要給第一個一半,另外一個要注意的地方便是(每一個人的初始糖果給別人一半,並不是接受了別人的糖果以後再給別人一半)。