文章

【GESP】C++一级练习BCQM3048,顺序执行、逆推运算

一道根据结果,一步一步逆推之前结果的题,完全顺序语句执行。

BCQM3048

题目要求

描述

甲、乙、丙三人共有x元钱,先由甲分钱给乙、丙两人,所分给的数与各人已有数相同;接着由乙分给甲、丙,分法同前;再由丙分钱给甲、乙,分法亦同前。经上述三次分钱之后,每个人的钱数恰好一样多。 求原先各人的钱数分别是多少?

输入

三个人的总钱数。(0≤x≤109)

输出

甲乙丙三人原有的钱数,用空格隔开。

输入样例

24

输出样例

13 7 4


题目分析

这道题目需要我们从最终状态逆推回初始状态:

  1. 最终状态:三人钱数相等,每人拥有总钱数的三分之一,即 x/3。

  2. 逆推第三次分钱(丙分钱给甲、乙):
    • 甲和乙的钱数是现在的一半
    • 丙分钱前的钱数是现在的 + 现甲 + 现乙
  3. 逆推第二次分钱(乙分钱给甲、丙):
    • 甲和丙的钱数是现在的一半
    • 乙分钱前的钱数是现在的 + 现甲 + 现丙
  4. 逆推第一次分钱(甲分钱给乙、丙):
    • 乙和丙的钱数是现在的一半
    • 甲分钱前的钱数是现在的 + 现乙 + 现丙

通过这种逆推方法,我们可以得到初始状态下甲、乙、丙三人的钱数。

代码参考

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
#include <iostream>
using namespace std;

int main() {
    int x;
    cin >> x; // 输入总钱数

    // 最终状态:三人钱数相等,都是总钱数的三分之一
    int avg = x / 3;
    int first, second, third;

    // 第三次分钱后,达到最终状态
    // 从最终状态逆推丙分给甲乙之前
    first = avg / 2; // 甲的钱变成了现在的一半
    second = avg / 2; // 乙的钱变成了现在的一半
    third = avg + first + second; // 丙分出去了甲乙现在的钱数,所以加上这些

    // 逆推乙分给甲丙之前
    first = first / 2; // 甲的钱变成了现在的一半
    third = third / 2; // 丙的钱变成了现在的一半
    second = second + first + third; // 乙分出去了甲丙现在的钱数,所以加上这些

    // 逆推甲分给乙丙之前
    second = second / 2; // 乙的钱变成了现在的一半
    third = third / 2; // 丙的钱变成了现在的一半
    first = first + second + third; // 甲分出去了乙丙现在的钱数,所以加上这些

    // 输出初始状态三人分别的钱数
    cout << first << " " << second << " " << third << endl;
    return 0;
}

所有代码已上传至Github:https://github.com/lihongzheshuai/yummy-code

GESP 学习专题站:GESP WIKI

luogu-”系列题目可在洛谷题库进行在线评测。

bcqm-”系列题目可在编程启蒙题库进行在线评测。

欢迎加入Java、C++、Python技术交流QQ群(982860385),大佬免费带队,有问必答

欢迎加入C++ GESP/CSP认证学习QQ频道,考试资源总结汇总

欢迎加入C++ GESP/CSP学习交流QQ群(688906745),考试认证学员交流,互帮互助

GESP/CSP 认证学习微信公众号
GESP/CSP 认证学习微信公众号
本文由作者按照 CC BY-NC-SA 4.0 进行授权