FZU - 1076 一辆吉普车来到x公里宽的沙漠边沿A点,吉普车的耗油量为1升/公里

博客探讨了一辆吉普车穿越沙漠的最省油策略。车辆每次能携带500升油,每公里消耗1升。问题在于如何设置临时储油点以达到最小耗油。通过从终点倒推,发现每个储油点的油量需求是500的倍数,而往返次数与储油站数呈2k-1的关系。

题目大意:穿越沙漠问题,车子最多只能装500L的油,每公里消耗1L的油,但是要穿越过沙漠,沙漠的长度可能大于500,求最小的耗油量

开始有点百思不得其解,这只能装500L,那不是得来回的绕啊绕的,到底怎么绕才是最少耗油呢……中间肯定要设置“加油站”,即为零时储油点,里面的油是车子自己通过返来返去,存储的……

 后来想从最后面倒过来想:

     我们的最后一个储油点,里面要恰好储存500L,来走完最后的500公里,那样出来沙漠,油一滴不剩,那就是最少的了……

     然后是第二站(为了方便说明,我就把倒二站称它为第2站,到时候,离出发点最近的储油点,称第k站),第二站要往1站存储500L,至少要正向两趟,返回一趟,共3趟,所以500/3(去)+500/3(存储)+500/3(返回)+500/3(去)+500*2/3(存储),可以看到两个标注“存储的”加起来就是500了。路上耗油了500,加起来第2站就要有1000L的油了

     然后再推第3站,要为第2站存储1000L 的油,车子正向一定至少要送三趟(每趟至多500L,因为路上要耗,所以两趟是不够的),返回还要两趟,一共来回就5趟了:500/5(去)+500*3/5(储存)+500/5(返回)+500/5(去)+500*3/5(储存)+500/5(返回)+500*4/5(储存)+500/5(去),存储的加起来1000L.加上路上的耗油500L,第三站要存1500L

……

现在已经可以看出规律了,第1站要存500L,第2站要存1000L,第3站要存1500L……所以第K站要存的就是500*K L了,

再来看往返次数t和站数K的关系第2站到第一站要往返3次,第3站到第2站要往返5次……很容易可以知道t=2*k-1

#include<stdio.h> #include<iostream> using namespace std; int main() {     int k;cin>>k;     while(k--){         int n;cin>>n;int k=1;         double L=500.0;         while(L<=n){///500.0/(2*k-1)表示从倒数第k到倒数第k-1个加油站的距离             k++;L+=500.0/(2*k-1);         }         L-=500.0/(2*k-1);///返回到A点前一个加油站         double res=n-L;         printf("%.3lf\n",500.0*(k-1)+res*(2*k-1));
}
}
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值