1032 – 分糖果

分析问题

想象一下,有5个小朋友围坐在一张圆桌旁,编号分别是1、2、3、4、5号。他们每个人手里都有一些糖果(糖果数量是整数)。现在,他们玩一个分糖果游戏,规则是这样的:

  1. 从1号小朋友开始,按顺序轮流分糖果(1号→2号→3号→4号→5号)。
  2. 每个小朋友分糖果时
  • 把自己的糖果平均分成三份(如果不能整除,就把多余的糖果吃掉)。
  • 自己留一份
  • 另外两份分别分给左边和右边的小朋友(因为是圆桌,所以1号的左边是5号、右边是2号;2号的左边是1号、右边是3号;3号的左边是2号、右边是4号;4号的左边是3号、右边是5号;5号的左边是4号、右边是1号)。
  1. 分完后,糖果数量会变化,下一个小朋友分糖果时,用的是当前最新的糖果数量

游戏进行一轮(所有5个小朋友都分一次糖果),然后我们看看每个人手里还剩多少糖果。

建立模型(用简单步骤模拟)

我们可以用5个变量来表示每个小朋友的糖果数量(比如叫 s1, s2, s3, s4, s5)。然后按照顺序模拟每个小朋友的操作:

  1. 1号小朋友分糖果
  • 计算每份糖果:份数 = s1 / 3(整数除法,只取整数部分,余数被吃掉)。
  • 自己留一份:s1 = 份数
  • 左边(5号)和右边(2号)各得一份:s5 += 份数, s2 += 份数
  1. 2号小朋友分糖果
  • 计算每份糖果:份数 = s2 / 3(注意:s2 可能已经被1号分糖果时改变)。
  • 自己留一份:s2 = 份数
  • 左边(1号)和右边(3号)各得一份:s1 += 份数, s3 += 份数
  1. 3号小朋友分糖果
  • 计算每份糖果:份数 = s3 / 3(s3 可能已经被前面的操作改变)。
  • 自己留一份:s3 = 份数
  • 左边(2号)和右边(4号)各得一份:s2 += 份数, s4 += 份数
  1. 4号小朋友分糖果
  • 计算每份糖果:份数 = s4 / 3(s4 可能已经被前面的操作改变)。
  • 自己留一份:s4 = 份数
  • 左边(3号)和右边(5号)各得一份:s3 += 份数, s5 += 份数
  1. 5号小朋友分糖果
  • 计算每份糖果:份数 = s5 / 3(s5 可能已经被前面的操作改变)。
  • 自己留一份:s5 = 份数
  • 左边(4号)和右边(1号)各得一份:s4 += 份数, s1 += 份数

一轮结束后,输出 s1, s2, s3, s4, s5 的值。

编写程序(C++)

下面是完整的C++程序,实现了上述模型。程序会读取一行输入(五个整数),然后模拟分糖果过程,最后输出结果。

#include <bits/stdc++.h>
using namespace std;

int main() {
    // 读取输入:五个整数,代表初始糖果数(顺序:1号, 2号, 3号, 4号, 5号)
    int a, b, c, d, e;
    cin >> a >> b >> c >> d >> e;

    // 初始状态:s1, s2, s3, s4, s5 分别代表1~5号小朋友的当前糖果数
    int s1 = a, s2 = b, s3 = c, s4 = d, s5 = e;

    // 1号小朋友分糖果
    int q1 = s1 / 3;  // 每份糖果的数量(整数除法,余数被吃掉)
    s1 = q1;          // 自己留一份
    s5 += q1;         // 左边(5号)得一份
    s2 += q1;         // 右边(2号)得一份

    // 2号小朋友分糖果
    int q2 = s2 / 3;  // 用当前s2计算
    s2 = q2;          // 自己留一份
    s1 += q2;         // 左边(1号)得一份
    s3 += q2;         // 右边(3号)得一份

    // 3号小朋友分糖果
    int q3 = s3 / 3;  // 用当前s3计算
    s3 = q3;          // 自己留一份
    s2 += q3;         // 左边(2号)得一份
    s4 += q3;         // 右边(4号)得一份

    // 4号小朋友分糖果
    int q4 = s4 / 3;  // 用当前s4计算
    s4 = q4;          // 自己留一份
    s3 += q4;         // 左边(3号)得一份
    s5 += q4;         // 右边(5号)得一份

    // 5号小朋友分糖果
    int q5 = s5 / 3;  // 用当前s5计算
    s5 = q5;          // 自己留一份
    s4 += q5;         // 左边(4号)得一份
    s1 += q5;         // 右边(1号)得一份

    // 输出结果:五个小朋友的剩余糖果数(顺序:1号, 2号, 3号, 4号, 5号)
    cout << s1 << " " << s2 << " " << s3 << " " << s4 << " " << s5 << endl;

    return 0;
}

保存 编译 运行