本题解就是在判断所有小朋友手中的糖果数目是否相同的时候用了一个Set去重,然后判断set的长度是否为1,其它地方和网上的题解大致相仿,不再赘述。
蓝桥杯2014年第五届真题-分糖果
时间限制: 1Sec 内存限制: 128MB
题目描述
有n个小朋友围坐成一圈。老师给每个小朋友随机发偶数个糖果,然后进行下面的游戏:
每个小朋友都把自己的糖果分一半给左手边的孩子。
一轮分糖后,拥有奇数颗糖的孩子由老师补给1个糖果,从而变成偶数。
反复进行这个游戏,直到所有小朋友的糖果数都相同为止。
你的任务是预测在已知的初始糖果情形下,老师一共需要补发多少个糖果。
输入
程序首先读入一个整数N(2< N< 100),表示小朋友的人数。
接着是一行用空格分开的N个偶数(每个偶数不大于1000,不小于2)
输出
要求程序输出一个整数,表示老师需要补发的糖果数。
样例输入
3 2 2 4
样例输出
4
public class b08分糖果 {
static int N;
static int ans;
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
N = scanner.nextInt();
int[] a = new int[N];
for(int i = 0;i < N;i ++) {
a[i] = scanner.nextInt();
}
Set<Integer> set = new HashSet<>();
while(set.size() != 1) {
set.clear();
int t=a[0];
for(int i=0;i<=N-2;++i) {
a[i]-=a[i]/2;//每个小朋友先扣自己的一半
a[i]+=a[i+1]/2;//再补下一个小朋友给他的一半
if((a[i]&1)==1) {//是否是奇数
ans++;
a[i]++;//老师补
}
}
a[N-1]-=a[N-1]/2;//倒数第一个小朋友先扣自己一半
a[N-1]+=t/2;//再补第一个小朋友给他的一半
if((a[N-1]&1)==1) {//是否是奇数
ans++;
a[N-1]++;//老师补
}
for(int i = 0;i < N;i ++) {
set.add(a[i]);
}
}
System.out.println(ans);
}
}