参考: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<iostream>
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;
}