lanqiao歷屆試題--分糖果

 題目鏈接:點擊打開鏈接  分糖果

問題描述
  有n個小朋友圍坐成一圈。老師給每個小朋友隨機發偶數個糖果,然後進行下面的遊戲:

  每個小朋友都把自己的糖果分一半給左手邊的孩子。

  一輪分糖後,擁有奇數顆糖的孩子由老師補給1個糖果,從而變成偶數。

  反覆進行這個遊戲,直到所有小朋友的糖果數都相同爲止。

  你的任務是預測在已知的初始糖果情形下,老師一共需要補發多少個糖果。
輸入格式
  程序首先讀入一個整數N(2<N<100),表示小朋友的人數。
  接着是一行用空格分開的N個偶數(每個偶數不大於1000,不小於2)
輸出格式
  要求程序輸出一個整數,表示老師需要補發的糖果數。
樣例輸入
3
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;
}
就是組成了一個圈,每個人 把他的糖果的一半給他左面的人,別忘了最後一個人的糖果要給第一個一半,另外一個要注意的地方便是(每一個人的初始糖果給別人一半,並不是接受了別人的糖果以後再給別人一半)。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章