1056 沙漠储油点

参考:https://blog.csdn.net/daoqin121/article/details/39321481

题目描述

Time Limit: 1000 ms
Memory Limit: 256 mb

一辆重型卡车预穿过长度大于1000公里小于1500公里的沙漠,卡车耗油为1升/公里,卡车总载油能力为500升。显然卡车装一次油是过不了沙漠的,因此司机必须设法在沿途建立几个储油点,使卡车能顺利穿越沙漠,试问司机如何建立这些储油点?每一个储油点应存多少汽油,才能使卡车以消耗最少汽油的代价通过沙漠? 请通过编程技术及 打印储油点的序号,各储油点距离沙漠始点的距离以及储油点的储油量.

输入输出格式

输入描述:

预穿过沙漠的长度公里整数Dis(大于1000公里小于1500公里).当输入0时程序结束.

输出描述:

储油点序号 起始点到储油点的长度 储油点的储油量 ,这三个变量在一行中输出,每两个数据中有两个空格.并且这三个数据占一行.

输入输出样例

输入样例#:

1000
1100
0

输出样例#:

1  25  3500
2  63  3000
3  108  2500
4  163  2000
5  234  1500
6  334  1000
7  500  500
1  14  5500
2  37  5000
3  63  4500
4  92  4000
5  125  3500
6  163  3000
7  208  2500
8  263  2000
9  334  1500
10  434  1000
11  600  500

题意分析:

首先明确一点:储油点的油都是卡车自己从起点一个个运过来的,即:卡车首先从起点跑若干趟将油运到第一个储油点,然后依次跑若干趟将油运往下一个储油点,最后距离终点500km时即可跑一趟就能到达终点

所以,从后往前分析,将距离终点最近的一个储油点设为第一个点,与终点的距离用数组dis存储,储油量用数组oil存储,dis[1] = 500, oil[1] = 500

由于卡车最大储油量为500L,所以(相较于起点而言的)前一个站点应该比后一个站点多500L油,这500L是用于两个站点之间的路程消耗

所以得出递推式:dis[i+1] = dis[i] + 500 / (2*i + 1), oil[i+1] = oil[i] + 500

最后输出的时候要记得将总路程减去dis之后逆向输出

代码:

#include
using namespace std;
int main()
{
	int dis[100];
	int oil[100];
	dis[0] = oil[0] = 0;
	dis[1] = oil[1] = 500;
	
	int i, j;
	for (i = 1; dis[i] <= 1500; i++) {
		dis[i+1] = dis[i] + 500 / (2*i + 1);
		oil[i+1] = oil[i] + 500;
	}
	 
	while (1) {
		int sum;
		cin >> sum;
		if (sum == 0)
			break;
		for (j = i-1; j > 0 && dis[j] > sum; j--);
		for (int k = 1; j > 0; k++, j--) {
			cout << k << "  " << sum - dis[j] << "  " << oil[j] << endl;
		}
	}
	return 0;
}

 

你可能感兴趣的:(N诺)