倒推法解决“四人玩火柴棍游戏,每一次都是三个人赢,一个人输”问题
问题:四人玩火柴棍游戏,每一次都是三个人赢,一个人输。输的人要按赢者手中的火柴数进行赔偿,即赢者手中有多少根火柴棍,输者就赔偿多少根。现知道玩过四次后,每人恰好输过一次, 而且每人手中都正好有16根火柴。问此四人做游戏前手中各有多少根火柴? 编程解决此问题。
这个问题是一道C++的编程入门题目,如果按正推来解决此问题的话。思路:设四个人的初始火柴棍分别为a,b,c,d.然后对其进行穷举,最后找到满足题意条件的一组值。这种方法的好处是比较简单,但是程序的运行效率可能不是太好,而且代码也比较复杂。
如果用倒推的方法解决这个问题,则会变的非常简单。思路如下:
我们知道最后每人手中的火柴棍都是16根,我们假设从第一个人开始,第一个人输第一轮...第四个人输第四轮。
我们设倒数第一轮时每个人手中的火柴棍分别为a,b,c,d.此时是第四个人输,其他人赢。
a b c d (第四轮)
2a 2b 2c d+a+b+c (最后)
有上可知,因为最后的时候每人手中的火柴棍数量相同,所以2a=2b=2c,则a=b=c
我们设倒数第一轮时每个人手中的火柴棍分别为a1,b1,c1,d1,此时该是第三个输,其他人赢。
a1 b1 c1 d1 (第三轮)
2a1 2b1 c1-a1-b1-d1 2d1( 这是按规则计算出来的第四轮结果)
a b c d (第四轮)
此时可知,2a1=a,2b1=b,2d1=d.因此上式可以改写成:
a/2 b/2 c+a/2+b/2+c/2 d/2 (第三轮)
a b c d (第四轮)
有上面的推断我们可以知道:
a/2 b/2 c+a/2+b/2+c/2 d/2 (第三轮)
a b c d (第四轮)
2a 2b 2c d+a+b+c (最后)
由此我们可以得知,如果用倒推法来解决此问题的话,我们可以想象这个问题的逆问题:我们初始化刚开始时每人手中有16根火柴棍,而且每轮都是三个人输,一个人赢,每个输的人都需要把自己火柴棍的一半给赢的人。经过四轮这样的比赛,我们求四轮之后每个人手中的火柴棍的数量。这个即是原问题的逆问题。此问题求得的最后每个人手中火柴棍的数量即为原问题的解。
采用这个思路的话,可以很容易的用非常简单的代码来解决这个问题。代码如下:
#include<iostream>
using namespace std;
void main()
{
int a[4]={16,16,16,16};for(int i=0;i<4;i++){for(int j=0;j<4;j++){if(j==i)continue;a[i]+=a[j]/2;a[j]=a[j]/2;}}for(int i=0;i<4;i++){cout<<a[i]<<endl;}}
倒推法解决“四人玩火柴棍游戏,每一次都是三个人赢,一个人输”问题相关推荐
- 转载:改“条件导向法”为“目标倒推法”
http://blog.vsharing.com/chunzhixishui/A1790831.html 改"条件导向法"为"目标倒推法"(转) 做事情的时候, ...
- (c语言)轮流抽取扑克牌问题-----倒推法 2021-11-09
(c语言)轮流抽取扑克牌问题-----倒推法 问题: 54张扑克牌,两个人轮流拿牌,每人每次最少取1张,最多取四张.谁拿最后一张谁输.编写模拟计算机先拿牌且必胜的算法. 问题分析: 要保证每轮拿牌总数 ...
- 实用算法的分析与程序设计——递推法(倒推法)
倒推法就是在不知初始值的情况下,经某种递推关系而获知问题的解或目标,再倒过来,推知它的初始条件.因为这类问题的运算过程是一一映射的,故可分析得其递推公式,然后再从这个解或目标出发,采用倒推手段,一步步 ...
- 迭代算法集锦(倒推法)
求解步骤 1.确定迭代模型 2.建立迭代关系式 3.控制迭代过程 今天我们来用几个简单的例子来了解倒推法 倒推法 1.猴子吃桃 题目描述: 猴子第一天采摘了一些桃子, 第二天吃了第一天的一半多一个, ...
- 穿越沙漠问题(C++倒推法)
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 题目: 穿越沙漠问题. 用一辆吉普车穿越1000km的沙漠.吉普车的总装油量为500usgal,耗油率为1加仑/km.由于沙漠中没有油 ...
- 猴子吃桃问题(C++倒推法)
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 题目: 一只猴子摘了若干桃子,每天吃现有桃的一半多一个,到第10天时就只有一个桃子了,求原有多少个桃子? 提示:ai=(1+ai+1) ...
- 算法系统学习-正的麻烦反着来呗!(迭代算法-倒推法)
倒推法 所谓的倒推法,是对某些特殊问题所采用的违反通常习惯的,从后向前推解问题的方法,正向推理比较麻烦时,反而在逆向推理中更加巧妙地解决问题. Case1猴子吃桃问题 一只小猴子摘了若干个桃子,每天吃 ...
- 算法第二节:逆推法解决“银行存款问题
问题描述:母亲为儿子sun 4年的大学生活准备了一笔存款,方式是整取零存,规定sun 每个月月底取下一个月的生活费.假设银行年利息为1.71%,计算该母亲每个月至少要存入多少钱? 算法分析:可采用逆推 ...
- C语言解决四人/多人过桥问题
参加笔试的时候遇到一道经典的算法题,四人过桥问题.当时没写出来
最新文章
- Oralce null
- Vivado时钟分组约束的三类应用
- HBase thrift C++编程
- pg 定时删除_PostgreSQL的时间函数使用整理
- GIS实战应用案例100篇(三)-基于NDVI指数的绿地信息提取
- Adobe Illustrator CS6 绿色简体中文版下载地址
- 昔年浅谈做害虫消杀防护的用什么推广效果好?
- Hbuilder X 开发APP指南
- 前端框架(混合开发框架)
- Splunk:大数据智能分析平台全能日志分析利器
- 设有一个 Student 数据库,包括 数据库,包括 学生 , 课程 , 选修三个关系: 三个关系: 学生 学生:S ( Sno ,Sname ,Ssex ,Sage,Sdept ) 课程 课程:
- Linux下dislocate命令用法,dislocate
- 解决罗技K580键盘win和alt键互换问题
- SpringDataJPA(二):SpringDataJPA的运行原理以及基本操作
- 罗彻斯特大学计算机科学系专业排名,罗切斯特大学排名计算机工程,得用心去看...
- 10 款牛哄哄的 Chrome 插件
- (转)Java学习书籍推荐
- 华师大 OJ 2822
- Sentinel 限流使用案例
- 陆金所java_陆金所金融核心场景数据库的去 O 之路
热门文章
- mysql怎么集合查询_MySql集合查询
- 小程序在线客服完整实现
- PCIe传输速率和有效带宽计算方式
- flink SourceFunction could not be inferred. Support for synthetic interfaces, lambdas, and generic
- linux里数据库退格,Oracle Database for Linux 不能使用退格键
- 《红楼梦》香的祭祀文化
- canvas画线变粗变模糊的解决办法
- 京东云服务器做系统,京东云新一代自研云服务器4月上线,云实例承载能力提升2倍...
- C++ std::regex | 正则表达式
- TREC之使用terrier进行信息检索