URAL 1113(数学)

题目链接:URAL 1113

解题思路:
这道题目其实是一类经典题目来着,是一道极限问题,即穿越沙漠问题,这种题目都是求在油箱容量受限的前提下,车辆如何走一段比较长的路的问题。一开始想没有想出来,后来看到这篇博客,就懂了。
这题为了使耗油量最小,很显然需要让车走最少的路程,因此必须每次启程,都能让油箱填满。所以可以使用倒推法进行求解,从最后一个油站开始,前一个油站总是要比后一个油站多储存等同于油箱容量的油,所以从后面数起,第 i 个油站与第 i-1 个油站(终点)总是距离M*( 2i - 1 )(M为油箱容量),需要在两个油站之间运输2*i-1次油;而给最后一个油站(第一个油站)补给的则需要油量m*( 2k - 1 )(m为起点到第一个油站的距离,k为油站数量)。

代码:

#include <cmath>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>

using namespace std;

double n,m,ans;

int main()
{
    while(~scanf("%lf %lf",&n,&m))
    {
        ans=0;
        int i=1;
        while(n-m/(2*i-1)>0)
        {
            ans+=m;
            n-=m/(2*i-1);
            i++;
        }
        ans+=n*(2*i-1);
        printf("%.0lf\n",ceil(ans));
    }

    return 0;
}

你可能感兴趣的:(URAL 1113(数学))