当前位置 博文首页 > 啦啦啦的博客:蓝桥杯 历届试题 分糖果

    啦啦啦的博客:蓝桥杯 历届试题 分糖果

    作者:[db:作者] 时间:2021-09-21 18:08

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

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

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

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

      你的任务是预测在已知的初始糖果情形下,老师一共需要补发多少个糖果。
    输入格式
      程序首先读入一个整数N(2

    思路:

    简单的模拟题,因为每个学生的糖果数在每一轮开始时都是偶数,且每个小朋友都把自己的糖果分一半给左手边的孩子是所有孩子同步进行的,所以,我们可以直接把所有孩子的糖果数除以二,然后从第“n”个孩子开始加上上一个孩子的糖果数,直到第一个孩子,第一个孩子加第“n”个孩子的糖果数(之前要保存),然后计算要补的糖数。

    代码:

    import java.util.*;
    import java.io.*;
    import java.math.*;
    public class Main {
        public static void main(String[] args) {
            Scanner cin = new Scanner(new BufferedInputStream(System.in));
            int n = cin.nextInt();
            int[] a = new int[n];
            int count = 0;
            for(int i=0;i<n;i++) {
                a[i] = cin.nextInt();
            }
            while(true) {
                int i = 0;
                for(i=0;i<n;i++) {
                    a[i] /= 2;
                }
                int t = a[n-1];
                for(i=n-1;i>0;i--) {
                    a[i] += a[i-1];
                }
                a[0] += t;
                for(i=0;i<n;i++) {
                    if(a[i] % 2 == 1) {
                        count++;
                        a[i] += 1;
                    }
                }
                for(i=1;i<n;i++) {
                    if(a[i] != a[i-1]) {
                        break;
                    }
                }
                if(i == n) break;
            }
            System.out.println(count);
        }
    }
    cs