一级
C++ 算法考级专栏
真题分析、矩阵探测、递归回溯与基础语法
🎨 视觉封面【GESP】C++一级练习BCQM3048,顺序执行、逆推运算
📅 2024-10-10·✍️ OneCoder·计算中...·⏱️ 4 分钟
#GESP#C++#基础语句
一道根据结果,一步一步逆推之前结果的题,完全顺序语句执行。
BCQM3048
题目要求
描述
甲、乙、丙三人共有x元钱,先由甲分钱给乙、丙两人,所分给的数与各人已有数相同;接着由乙分给甲、丙,分法同前;再由丙分钱给甲、乙,分法亦同前。经上述三次分钱之后,每个人的钱数恰好一样多。 求原先各人的钱数分别是多少?
输入
三个人的总钱数。(0≤x≤109)
输出
甲乙丙三人原有的钱数,用空格隔开。
输入样例
24
输出样例
13 7 4
题目分析
这道题目需要我们从最终状态逆推回初始状态:
-
最终状态:三人钱数相等,每人拥有总钱数的三分之一,即 x/3。
-
逆推第三次分钱(丙分钱给甲、乙):
- 甲和乙的钱数是现在的一半
- 丙分钱前的钱数是现在的 + 现甲 + 现乙
-
逆推第二次分钱(乙分钱给甲、丙):
- 甲和丙的钱数是现在的一半
- 乙分钱前的钱数是现在的 + 现甲 + 现丙
-
逆推第一次分钱(甲分钱给乙、丙):
- 乙和丙的钱数是现在的一半
- 甲分钱前的钱数是现在的 + 现乙 + 现丙
通过这种逆推方法,我们可以得到初始状态下甲、乙、丙三人的钱数。
代码参考
CPP
#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;
}
💡 OneCoder 资源指引
所有代码开源上传至 GitHub:yummy-code 仓库 · GESP 专题站:GESP WIKI
🤝 技术交流与答疑
欢迎加入:C++ GESP/CSP 考级答疑群(688906745) 与 Java/Python交流群(982860385),点击可直接加群。
📚
猜你想读 · 相关文章推荐
OneCoder (lihongzheshuai)
一个中年人的自留地,记录学习 C++、GESP/NOI、Java、Python 与算法架构的心得体会。本站唯一网址:coderli.com
💬 读者留言与交流
还没有留言,快来成为第一个讨论者吧!