藍橋杯_分糖果試題

標題:分糖果

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

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

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

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

你的任務是預測在已知的初始糖果情形下,老師一共需要補發多少個糖果。

【格式要求】

程序首先讀入一個整數N(2<N<100),表示小朋友的人數。
接着是一行用空格分開的N個偶數(每個偶數不大於1000,不小於2)
要求程序輸出一個整數,表示老師需要補發的糖果數。

例如:輸入
3
2 2 4
程序應該輸出:
4

解題思想:接受輸入數據,調用方法f(),運用遞歸的方法,模擬一輪一輪的分糖過程,並在所有人的糖果數相同的情況下打印結果退出遞歸。

<java>
import java.util.Scanner;
public class B14_8 {

public static boolean test(int[] arr){

    int n = 0;
    for(int i=1; i<arr.length; i++){        //***注意:i=0;i<length 就是arr[0]--arr[length],但是arr[length]是越界的!!!!***
        if(arr[i-1] != arr[i]){             //所以,在用 i=0;i<length 時,注意內部循環體的數組最大爲arr[length-1]
            n=1;
            break;
        }
    }
    if(n == 1) return false;
    else return true;

}

public static void f(int[] arr,int count){

    if(test(arr)){//arr所有元素相同
        System.out.println(count);
        return;
    }

    int[] b = new int[arr.length];//緩存數組    
    b[arr.length - 1] = arr[arr.length - 1]/2 + arr[0]/2;
    for(int i=0; i<arr.length-1; i++){
        b[i] = arr[i]/2 + arr[i+1]/2;//先分一半給左手邊
    }
    /*
    b[i-1] = b[i-1] + arr[i]/2;
    b[i-2]
    ...
    b[0] = arr[0] + arr[1]/2 
    */
    for(int j=0; j<arr.length; j++){
        if(b[j] % 2 == 1){
            b[j]++;             //如果是奇數,補發一個
            count++;
        }
        arr[j] = b[j];          //轉移數據
    }

    f(arr,count);

}

public static void main(String[] args) {
    //N 小朋友
    Scanner sc = new Scanner(System.in);
    int N = sc.nextInt();
    int[] arr = new int[N]; 
    for(int i=0;i<N;i++){
        arr[i] = sc.nextInt();
    }

    f(arr,0);
   }
}
</java>
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章