P48. 【例10.2】分钱游戏 https://ok.hn.cn/p/P48
说明
甲、乙、丙三人共有\(x\)元钱,先由甲分钱给乙、丙两人,所分给的数与各人已有数相同;接着由乙分给甲、丙,分法同前;再由丙分钱给甲、乙,分法亦同前。经上述三次分钱之后,每个人的钱数恰好一样多。 求原先各人的钱数分别是多少?
输入格式
三个人的总钱数。(\(0 \le x \le 10^9\))
输出格式
甲乙丙三人原有的钱数,用空格隔开。
题解
使用倒推法(逆序)!!!从最后结果入手,按反向顺序,分步骤推算出每次分钱每个人的钱数
三次分前后 每个人的钱数一样 就是x/3 = 24⁄3 =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)