1. 程式人生 > >[藍橋杯][2014年第五屆真題]分糖果

[藍橋杯][2014年第五屆真題]分糖果

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

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

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

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

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

輸入
程式首先讀入一個整數N(2< N< 100),表示小朋友的人數。
接著是一行用空格分開的N個偶數(每個偶數不大於1000,不小於2)

輸出
要求程式輸出一個整數,表示老師需要補發的糖果數。

樣例輸入
3
2 2 4
樣例輸出
4

解法
模擬就完事了

import java.util.Scanner;

public class Main{
	
	public static void main(String[] args) {
		
		Scanner sc = new Scanner(System.in);
		int N = sc.nextInt(); //代表小朋友的人數
		int[] a = new int[N]; //這個陣列用來儲存每一輪變化後的情況
		int[] b =new int[N];//這個陣列的值為a陣列變化前的值,為上一個陣列提供 計算的便利,如 a[2] = b[1]/2+b[2]/2;
		for
(int i=0;i<N;i++) { a[i] = sc.nextInt(); } b = a.clone(); int count = 0; //記錄老師發的糖數 int choice = 0; //儲存陣列中每位變化後的值 while(true) { for(int i=0;i<N;i++) { if(i==0){ a[i] = b[i]/2+b[N-1]/2; }else { a[i] = b[i]/2+b[i-1]/2; } if(a[i]%2!=0) { //如果為奇數個糖,直接+1個糖數 a[
i]++; count++; //記錄發的糖數 } if(i==0) { choice = a[i]; //儲存第一個小朋友的糖數,用來和後面的小朋友相比較 }else { if(a[i]!=choice) choice = 0; //若糖數不相同,則設為0 } } if(choice!=0) { //一輪變化後,判斷choice是否為0,若不是,則每個小朋友的糖相同 System.out.println(count); break; } b = a.clone(); //讓b替換為a變化一輪的值,方便a下一次的計算 } } }