线上百家乐

admin 2018-07-08 15:23 来源: 网络整理打印

线上百家乐

限期:1000手写本内存限度局限:10000K  总限期:3000ms

扮演

游览社必要报价汽车的最小本钱。,沿路有好专有的加油站。,每个加油站的费不尽然等于。。线上百家乐有列举如下药典: 免得油箱的油超越半品脱,取缔泊车加油,除非油箱里的油不支持下一站;每回加油都满了;加油站加油时,驾驶员购物要花2元钱。;驾驶员不用为那个事变预备额定的油。;汽车在无的处装满了油箱。;计算正确,得分(1元=100)。。编译顺序来预算书实践行驶的最小本钱。。

出口

概要的任一某一举措的无的与起点当中的间隔(RE) 以第二位行动的三个次数,尾随积分,每两个记载由一任一某一空的分开。。概要的任一某一数字是汽车油箱的大量(升)。,以第二位号码字是每升汽油的英里数。,第三号码是在无的处装满油箱的本钱(严守标准的)。,第四号码字是加油站的号码。。(〈=50)。上面的行由两个次数结合,每个记载由一任一某一空的分开。,概要的任一某一数是从加油站起始点的间隔。,以第二位号码字是加油站每升汽油的价钱。。加油站间隔它们当中的间隔是递加的。。迷住出口都有必然的解。

出口

一共两行,每条线都有更衣 次数和积分的概要的任一某一举措,次数是游览的最小费。,单位为单位,正确得分,一任一某一代表加油站N的积分。。以第二位行是n个积分。,代表N加油站的号码,按升序等级。记载由一任一某一空的分开,至死的记载也缺席空的中。,再说,无富余的空的。。

出口样例

516.3 15.7 22.1 20.87 3 125.4 1.259 297.9 1.129 345.2 0.999

出口样例

38.09 1 2

#include 
#include 
using namespace std;

int n;
double pay;
double length;
double oil[52][2];
double 本钱[ 52 ]
double capacity, kilometer, start;
int 注意[ 52 ]
int sum;

我能在盛产J的时分加油吗?
bool Canoil(int i, int j)
{
    double sum = 石油[J]〔0〕-油[I]〔0〕               加油站I和J当中的间隔
    double remain = capacity-sum/kilometer;         剩余物的装甲的从I到J
    免得(依然) <= capacity/2)
        return true;
    return false;
}

我盛产了油抵达j时假设必需加油
//oil[j+1][0]-oil[i][0]
//j处不加油必要保证能抵达j+1
bool Mustoil(int i , int j)
{
    double sum = oil[j+1][0]-oil[i][0];
    if(capacity*kilometer < sum)                    //油箱不足以支撑从i到j
        return true;
    return false;
}

void Search()
{
    为(int) i = n; i >= 0; i --)        我盛产了油
    {
        int flag = 0;
        免得(i) == n)                      必需处理的成绩,它可以抵达止境的止境
            本钱[我] = 0;
        else
        {
            为(int) j = i+1; j <= n; j++)   我盛产了油后,直到j处才再次加油(i到j中间的油站不加油)
            {
                if(Mustoil(i, j))       //i到j油量不够,必需加油
                {
                    //i处油箱满,j处再次加满油,i到j的耗油量(oil[j][0]-oil[i][0])/kilometer即为j处必要加的油量
                    pay = (oil[j][0]-oil[i][0])/kilometer*oil[j][1]+cost[j]+2;
                    if(flag == 0 || pay < 本钱[我])
                    {
                        本钱[我] = pay;
                        mark[i] = j;
                        j = n+1;        //j处必需加满油,结束循环,因为j处加满油的最小花费已经计算过了
                    }
                }
                else if(Canoil(i, j))   //油量小于半品脱,可以加油
                {
                    //可以加油,那么在j处要么加油,要么不加油
                    //尝试加油,不加油的状态隐含在j的那个值中
                    pay = (oil[j][0]-oil[i][0])/kilometer*oil[j][1]+cost[j]+2;
                    if(flag == 0 || pay < 本钱[我])
                    {
                        本钱[我] = pay;
                        flag = 1;
                        mark[i] = j;
                    }
                }
            }
        }
    }
}

加油站最低消费计算总数本钱的号码
void res()
{
    为(int) i=0; i<=n;)
    {
        if(mark[i]!=0)
        {
            sum++;
            i=mark[i];
        }
        else break;
    }
}

//按照格式出口
void Print()
{
    printf("%.2lf",cost[0]+start);
    cout<<" "<> length;          从无的到起点的间隔
    cin >> capacity;        罐大量
    cin >> kilometer;       每千米食物消耗量
    cin >> start;           无的瓦斯免费
    cin >> n;               加油站的号码

    为(int) i = 1; i <= n; i++)
    {
        cin >> oil[i][0] >> oil[i][1];  石油[I]〔0〕:从加油站I到无的的间隔
                                        石油[I]〔1〕:加油站I的油价
    }
    油[n 1]〔0〕 = length;   //起点,它必要被用来断定它假设必需加油。
    oil[0][0]=0;            //无的
    Search();               //求解
    res();                  加油站最低消费计算总数本钱的号码
    Print();                //出口
}

扫一扫在手机打开当前页
责任编辑:admin
推荐内容

热词
回到 顶部