蓝桥杯 历届试题 PREV-32 分糖果

历届试题 分糖果  
时间限制:1.0s   内存限制:256.0MB
问题描述
  有n个小朋友围坐成一圈。老师给每个小朋友随机发偶数个糖果,然后进行下面的游戏:

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

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

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

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

输入格式
  程序首先读入一个整数N(2<N<100),表示小朋友的人数。
  接着是一行用空格分开的N个偶数(每个偶数不大于1000,不小于2)
输出格式
  要求程序输出一个整数,表示老师需要补发的糖果数。
样例输入
3
2 2 4
样例输出
4
 
示例代码:
 import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader; public class Main {
private static int m;
private static int[] sweetsNum;
private static int addNum; //增加的糖果数
public static void main(String[] args) throws NumberFormatException, IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
m = Integer.parseInt(br.readLine()); sweetsNum = new int[m];
String[] str = br.readLine().split(" ");
for(int i = 0; i < m; i++){
sweetsNum[i] = Integer.parseInt(str[i]);
} candy(m,sweetsNum); System.out.println(addNum);
} /**
* 分糖果
* @param m 学生个数
* @param sweetsNum 每个学生的糖果数
*/
private static void candy(int m, int[] sweetsNum) {
while(true){
if(equal(sweetsNum)){
return;
}else{
//每个小朋友都把自己的糖果分一半给左手边的孩子
int temp = sweetsNum[0];
for(int i = 0; i < sweetsNum.length-1; i++){
sweetsNum[i] = sweetsNum[i+1]/2 + sweetsNum[i]/2;
}
sweetsNum[sweetsNum.length-1] = temp/2 + sweetsNum[sweetsNum.length-1]/2; //老师给奇糖果数的孩子补糖果
for(int i = 0; i < sweetsNum.length; i++){
if(sweetsNum[i]%2 != 0){
addNum++; //记录补的糖果数的数目
sweetsNum[i]++;
}
}
}
}
} /**
* 判断所有学生手中的糖果数是否相等
* @param sweetsNum 每个学生的糖果数
* @return 相等返回true,否则返回false
*/
private static boolean equal(int[] sweetsNum) {
int n = 0;
for(int i = 1; i < sweetsNum.length; i++){
if(sweetsNum[i] == sweetsNum[0]){
n++;
}
}
if(n == sweetsNum.length-1){
return true;
}
return false;
}
}
上一篇:[LeetCode] Candy Crush 糖果消消乐


下一篇:洛谷 P1204 [USACO1.2]挤牛奶Milking Cows Label:模拟Ex 74分待查