历届试题 分糖果

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

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

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

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

  你的任务是预测在已知的初始糖果情形下,老师一共需要补发多少个糖果。
输入格式
  程序首先读入一个整数N(2   接着是一行用空格分开的N个偶数(每个偶数不大于1000,不小于2)
输出格式
  要求程序输出一个整数,表示老师需要补发的糖果数。
样例输入
3
2 2 4
样例输出  
 4
我的思路
 一个数组存储小孩手里的糖(a[]),一个数组存储当前轮次小孩手里一半的糖(temp[])。
 然后a[i+1]+=temp[i]。child[0]+=temp[child.length-1];
代码
import java.util.ArrayList;
import java.util.Scanner;
public class Main {
	static Scanner scanf=new Scanner(System.in);
	static int count=0;	//老师发的糖果数量
	public static void main(String[] args) {
		int n = scanf.nextInt();
		int [] child=new int [n];	//存储小孩手里的糖
		int [] temp=new int [n];//存储当前轮次小孩手里糖的一半
		for (int i = 0; i < child.length; i++) {
			child[i]=scanf.nextInt();
		}
		while(isend(child)){		//如果所有小孩手里的糖不相等继续循环
			for (int i = 0; i < temp.length; i++) {
				temp[i]=child[i]/2;	//把小孩手里的一半糖存入temp
				child[i]-=child[i]/2;	//减去一半
			}
			for (int i = 0; i < child.length-1; i++) {
				child[i+1]+=temp[i];		//坐标错一位加  。 给左边的小朋友
			}
			child[0]+=temp[child.length-1];	//把最后一个小朋友的糖给第一个小朋友
			for (int i = 0; i < n; i++) {	//遍历分糖后奇数个数糖的小朋友
				if(child[i]%2!=0){
					child[i]++;
					count++;
				}
			}
		}
		System.out.println(count);
	}
	public static boolean isend(int [] child){
		for (int i = 1; i < child.length; i++) {
			if(child[i-1]!=child[i]){
				return true;
			}
		}
		return false;
	}
}
这个本来觉得肯定过不了,没想到一次跑满分,瞬间也不想优化了。这完全是暴力嘛



你可能感兴趣的:(经验分享,算法)