穿越沙漠问题

逆推思想也被称为倒推法,常常被用来解决 已知结果推导过程 的问题。


1. 引入:一个简单的猴子吃桃问题。

题目描述

一只小猴买了若干个桃子。第一天他刚好吃了这些桃子的一半,又贪嘴多吃了一个;接下来的每一天它都会吃剩余的桃子的一半外加 1 1 1 个。第 n n n 天早上起来一看,只剩下 1 1 1 个桃子了。请问小猴买了几个桃子?

输入格式

输入一个正整数 n n n,表示天数。

输出格式

输出小猴买了多少个桃子。

样例 #1

样例输入 #1

4

样例输出 #1

22

分析:

我们假设第n天的剩余桃子数为an
那么根据题目即可得到一个表达式:an = an-1 - (an-1 / 2 +1) = an-1 / 2 - 1
整理上式即可知道:an-1 = (1 + an) * 2

代码如下:

#include 
using namespace std;
int main() {
    int n,peach=1;
	cin>>n;
	
	for(int i=n;i>1;i--)
		peach = (1+peach)*2;	//不断更新peach
	
	cout<<peach;
}

2. 穿越沙漠问题

题目描述

一辆吉普车来到 1000 1000 1000 km宽的沙漠边沿。吉普车的耗油率为 1 1 1 加仑/km,吉普车的总装油量为500L。由于沙漠中没有油库,必须先用这辆车在沙漠中建立临时油库。该吉普以最少耗油量穿越沙漠,应在什么地方设置油库,并求出此油库的储油量是多少。

分析

根据最大储油量和沙漠距离可判断,距离终点最近的加油点 A1 应在距离500km处。
穿越沙漠问题_第1张图片
要使 A1 点有500L的储油,那么汽车必须要运油至该点。
但又要让油耗最低,所以当移动次数为奇数时最为省油。
我们推理出1次必然是不可能的,那么考虑移动3次的情况
由于三次移动要让 A1 点储油500L,画出分析图如下:
穿越沙漠问题_第2张图片
继续推理可知,A2 点的油量需要支撑 A1 的存储和移动中的油耗,故而可以知道 A2 的储油量为1000L。
要支持该点的储油量吉普移动 3 次的效果还不能达到要求,又要考虑奇数移动次数,那么最小的移动次数为 5 次
穿越沙漠问题_第3张图片
之后的加油点也如此推理即可,在此就不再赘述。
最终的结果为:
从终点开始,分别间隔500,500/3,500/5,500/7 ···(km)处设立加油点,
每个加油点的储油量为500,1000,1500,2000····(L)。

代码如下:

#include 
using namespace std;

#define ll long long

const ll DIS=1000;	//沙漠的距离
const ll OIL=500;	//吉普油箱最大储油量

int main() {
	ll oil = OIL;	//该点的储油量,A1点为油箱最大储油量
    ll dis = OIL;	//距离终点的距离,A1点为油箱最大储油量
    int i;
    for(i=2 ; dis < DIS ;i++){
		cout<< "该加油点距离终点:" << dis <<"km,储油量为:" << oil <<endl;
		dis += OIL/(2*i-1);
		oil += OIL;
	}
	oil += (DIS-dis) * (2*i-1);
	cout<< "该加油点距离终点:" << DIS <<"km,储油量为:" << oil <<endl;
}

运行结果如下:

穿越沙漠问题_第4张图片


你悟解了吗?

你可能感兴趣的:(算法,算法,图论,c++,学习,c语言)