P48. 【例10.2】分钱游戏 https://ok.hn.cn/p/P48

说明

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

输入格式

三个人的总钱数。(\(0 \le x \le 10^9\)

输出格式

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

题解

使用倒推法(逆序)!!!从最后结果入手,按反向顺序,分步骤推算出每次分钱每个人的钱数

三次分前后 每个人的钱数一样 就是x/3 = 243 =8 每个人8块钱

设 int a,b,c 为甲乙丙三个人的钱数 a=8 b=8 c=8

题目有个隐藏信息 甲分钱给乙、丙两人,所分给的数与各人(已有数相同)

意思就是:乙原有的钱乘以2=乙第一次分钱的数 丙原有的钱乘以2=丙第一次分钱的数

后面2次的分法也一样 所分给的数与各人(已有数相同) 就是双倍钱

分钱次数 甲a 乙b 丙c 谁分
最后 8 8 8
三次结果 8 8 8 丙c=24-甲a-乙b
三次分钱 4*2 4*2 24-8-8 丙c
二次结果 4 4 16 乙b=24-甲a-丙c
二次分钱 2*2 24-4-16 8*2 乙b
一次结果 2 14 8 甲a=24-乙b-丙c
一次分钱 24-14-8 7*2 4*2 甲a
原始 13 7 4

使用倒推法(逆序)!!!乘法变除法 减法变加法 模拟出来就行了

x = int(input())
a=b=c=x // 3;
#第三轮 丙分
a=a//2;
b=b//2;
c=a+b+c;
#第二轮 已分
a=a//2;
c=c//2;
b=b+a+c;
#第一轮 甲分
b=b//2;
c=c//2;
a=a+b+c;
#数据转换
a,b,c=map(int,[a,b,c])
print(a,b,c)