奥赛问题【最好用PASCAL】

来源:百度知道 编辑:UC知道 时间:2024/06/18 06:27:41
四个人玩火柴游戏,每玩完一次3个人赢,一人输。输的人要按赢者手中的火柴输进行赔偿,即赢者手中有多少根火柴棍,数这就赔偿多少根。他们只玩4次。现在知道4次后,每人恰好输过一次,而且每人手中都正好有16根火柴。问此4人做游戏前手中各有多少根火柴?
PASCAL解决

其实口算都能算出来的: 5 9 17 33
反推就行了.
PASCAL 程序代码:
var
a1,a2,a3,a4:integer;

begin
a1:=16; a2:=16; a3:=16; a4:=16;
a2:=a2 div 2; a3:=a3 div 2; a4:=a4 div 2; {假设a1最后一个输,反推第三次结束后各人的状态}
a1:=a1 + a2 + a3 + a4;

a1:=a1 div 2; a3:=a3 div 2; a4:=a4 div 2; {假设a2第三个输,反推第二次结束后各人的状态}
a2:=a1 + a2 + a3 + a4;

a1:=a1 div 2; a2:=a2 div 2; a4:=a4 div 2; {假设a3第二个输,反推第一次结束后各人的状态}
a3:=a1 + a2 + a3 + a4;

a1:=a1 div 2; a2:=a2 div 2; a3:=a3 div 2; {假设a4第一个输,反推初始状态}
a4:=a1 + a2 + a3 + a4;

writeln( a1 , ' ' , a2 , ' ' , a3 , ' ' , a4 );
end.

分析:
第一个输的人 赔偿之后手中要有2根火柴 因为之后肯定会有三次获得 最后要有16根火柴
同理 第二个输的 赔偿后留有4根 第三个8根 最后一个剩余16根
因为总共有16*4=64根火柴
我们设某人赔偿后剩余n根火柴 因为他要赔偿的数目与其他三人的火柴总数相同
则他要赔偿(64-n)/2 根火柴 则赔偿之前拥有(64-n)/2+n根火柴
根据这个公式
第一个输的人 赔偿之前应该有33根 即初始有33根
第二个输的人 赔偿之前应该有34根 因为之前获得过一次赔偿 初始应有17根
第三个输的人 赔偿之前应该有36根 因为之前获得过两次赔