分糖果

时间限制:1.0s   内存限制:256.0MB

问题描述



  有n个小朋友围坐成一圈。老师给每个小朋友随机发偶数个糖果,然后进行下面的游戏:

  每个小朋友都把自己的糖果分一半给左手边的孩子。

  一轮分糖后,拥有奇数颗糖的孩子由老师补给1个糖果,从而变成偶数。

  反复进行这个游戏,直到所有小朋友的糖果数都相同为止。

  你的任务是预测在已知的初始糖果情形下,老师一共需要补发多少个糖果。



输入格式



  程序首先读入一个整数N(2<N<100),表示小朋友的人数。
  接着是一行用空格分开的N个偶数(每个偶数不大于1000,不小于2)



输出格式



  要求程序输出一个整数,表示老师需要补发的糖果数。



样例输入



3
2 2 4



样例输出



4
【分析】
       简单的现实模拟。
【程序】
用java语言编写程序,代码如下:

import java.io.BufferedInputStream;
import java.util.Scanner;

public class Main {
public static void main(String[] args) {
Scanner input = new Scanner(new BufferedInputStream(System.in));
int n = input.nextInt();
int[] lf = new int[n];
for(int i = 0; i < n; i++)
lf[i] = input.nextInt();

int count = 0;
while(true) {
if(isSame(lf, n))
break;

distributeCandy(lf, n);

/*System.out.print(lf[0]);
for(int i = 1; i < n; i++)
System.out.print(lf[i]);
System.out.println();*/

count += reissueCandy(lf, n);
}

System.out.println(count);
}

public static boolean isSame(int[] lf, int n) {
for(int i = 1; i < n; i++) {
if(lf[i] != lf[i - 1])
return false;
}
return true;
}

public static void distributeCandy(int[] lf, int n) {
int first = lf[0];
for(int i = 1; i < n; i++) {
lf[i - 1] += lf[i] / 2;
lf[i] = lf[i] / 2;
}

lf[n - 1] += first / 2;
lf[0] -= first / 2;
}

public static int reissueCandy(int[] lf, int n) {
int count = 0;
for(int i = 0; i < n; i++)
if(lf[i] % 2 == 1) {
count++;
lf[i]++;
}
return count;
}
}