FOJ-1076 BIT1005 穿越沙漠

这道题意思是一辆车最多装500L油,中途可以放油,给你一个数,问到这里最少需要多少油


这题一开始想不出来,后来看解题报告说

普车在沙漠中建临时油库,是逐步向前推进的,即建好一个油库后,再建下一个油库

就懂了_(:з」∠)_

设从A点到达B点的路中建立了n个油库,从A到B依次编号为Cn,Cn-1,,,,,,,C1

显然C1建立的时候是500升油

设在建立Ci(最后有V1升油的时候)的过程中,用了C(i+1)的 V2升油,车子一开始装了0升油,车子往返了k次(k显然为奇数,一来一往为2次)

Ci与Ci+1的距离为L,一次往返(一来一往)V2减少500,V1增加500-2×L

最后一次从Ci+1开向Ci的过程中,V2减少500,V1增加500-L

则有方程

(k-1)/2*500+500=V2                      一式

(k-1)/2*(500-2*L)+500-L=V1         二式

由于车子每次出发都满载

且V2必大于V1

有V2=V1+X×500  X=1,2,,,,为满足最优取X=1

结合一式和二式解得k=(V1+250)/250    L=(500×250)/(V1+250)  此过程中V1为已知量

初始的V1已知,各个油库的量也可以依次算出来,接下来上代码


当然上面都是大神说的,我再稍微详细解释一下

刚开始我以为就是每次向前走500/3米(因为做过类似的题),被其思想束缚了

(主要是没有用公式推导证明,导致遇见相同类型的题目不会)

每次两个储油点的距离都不一样~

我以为两个储油点距离都是500/3;

这样肯定做不对了,至于储油点的距离,根据上面的公式就可以推出~

下面代码

#include<iostream>  
#include<stdio.h>  
#include<algorithm>  
using namespace std;  
int main()  
{  
    int total;  
    cin>>total;  
    while(total--)  
    {  
        double s;  
        cin>>s;//总长  
        double v1;//v1与以上本篇博客解释同义  
        for(v1=0;;v1+=500)//理解为初始要在B点建立0的油库  
        {  
            s-=(500*250)/(v1+250);  
            if(s==0)  
            {  
                break;  
            }  
            if(s<0)  
            {  
                s+=(500*250)/(v1+250);  
                break;  
            }  
        }  
        if(s==0)  
        {  
            v1+=500;  
            printf("%.3f\n",v1);  
            continue;  
        }  
        //要在距A点s处建立一个V1的油库,显然有v1/500+1次满载,往返总次数为v1/500*2+1  
        printf("%.3f\n",v1+s*(v1/250+1));  
    }  
    return 0;  
} 




  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值