LQ0216 分糖果模拟

Posted 海岛Blog

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LQ0216 分糖果模拟相关的知识,希望对你有一定的参考价值。

题目来源:蓝桥杯2014初赛 C++ C组H题

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

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

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

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

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

输入描述
程序首先读入一个整数 N (2<N<100),表示小朋友的人数。

接着是一行用空格分开的 N 个偶数(每个偶数不大于 1000,不小于 2)。

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

输入输出样例
示例
输入

3
2 2 4

输出

4

问题分析
用模拟法来解决。

AC的C语言程序如下:

/* LQ0216 分糖果 */

#include <stdio.h>

#define N 100
int a[N];

int main()

    int n;
    scanf("%d", &n);
    for (int i = 0; i < n; i++)
        scanf("%d", &a[i]);

    int sum = 0;
    for (; ;) 
        int cnt = 1;
        for (int i = 1; i < n; i++)
            if (a[i] == a[i - 1])
                cnt++;
            else
                break;
        if (cnt == n) break;

        for (int i = 0; i < n; i++)
            a[i] /= 2;

        int t = a[0];
        for (int i = 1; i < n; i++)
            a[i - 1] += a[i];
        a[n - 1] += t;

        for (int i = 0; i < n; i++)
            if (a[i] % 2 == 1)
                a[i]++, sum++;
    
    printf("%d\\n", sum);

    return 0;

以上是关于LQ0216 分糖果模拟的主要内容,如果未能解决你的问题,请参考以下文章

蓝桥--分糖果[模拟]

历届试题 分糖果-(暴力+模拟)

LeetCode 1103. Distribute Candies to People (分糖果 II)

HDU 1034(传递糖果 模拟)

清北学堂模拟赛d2t6 分糖果(candy)

2019年头条笔试--围坐分糖果