zoukankan      html  css  js  c++  java
  • 洛谷P1016 旅行家的预算

    题目描述

    一个旅行家想驾驶汽车以最少的费用从一个城市到另一个城市(假设出发时油箱是空的)。给定两个城市之间的距离D1、汽车油箱的容量C(以升为单位)、每升汽油能行驶的距离D2、出发点每升汽油价格P和沿途油站数N(N可以为零),油站i离出发点的距离Di、每升汽油价格Pi(i=1,2,…,N)。计算结果四舍五入至小数点后两位。如果无法到达目的地,则输出“No Solution”。

    输入输出格式

    输入格式:

    第一行,D1,C,D2,P,N。

    接下来有N行。

    第i+1行,两个数字,油站i离出发点的距离Di和每升汽油价格Pi。

    输出格式:

    所需最小费用,计算结果四舍五入至小数点后两位。如果无法到达目的地,则输出“No Solution”。

    输入输出样例

    输入样例#1:
    275.6 11.9 27.4 2.8 2
    102.0 2.9
    220.0 2.2
    
    输出样例#1:
    26.95
    分析:这道题比较容易想,就是实现细节实在是太考验人了.显然,走的路程是一定的,如果我们能使每一单位路程花的钱最少就好了,先把所有加油站按照距离从小到大排序,如果当前在加油站i,就算加满了油也无法到达其它的加油站,那么无解,如果在范围内有油费比i小的,那么就加油正好走到这个加油站,这样单位路程的油费就比i的小,如果没有邮费比i小的,那么就尽量选一个油费最小的,先加满油再开过去,因为i的油费更便宜,这个细节实在是太难调了QAQ
    #include <cstdio>
    #include <cstring>
    #include <iostream>
    #include <algorithm>
    #include <cmath>
    #include <cfloat>
    
    using namespace std;
    
    int n,st;
    double d1,c,d2,p,ans,you;
    bool flag2 = false;
    
    struct node
    {
        double d,p;
    } e[100010];
    
    bool cmp(node a,node b)
    {
        return a.d < b.d;
    }
    
    /*
        1.在当前油站i如果加满了油,看能走到的油站中有没有费用更小的
        2.如果没有,就加满油,然后到费用最低的那个去.
        3.否则,加油刚好到费用最低的加油站就好了.
        原理就是走的路程就是那么多,路程上花的钱越少越好.
    */
    
    int main()
    {
        cin >> d1 >> c >> d2 >> p >> n;
        for (int i = 1; i <= n; i++)
            cin >> e[i].d >> e[i].p;
        sort(e + 1,e + 1 + n,cmp);
        e[0].d = 0;
        e[0].p = p; 
        int t = 0;
        while (1)
        {
            bool flag = false;
            int wh = 10000;
            for (int i = t + 1; i <= n; i++)
            {
                if (e[i].d - e[t].d > c * d2)
                break;
                if (e[i].p < e[t].p)
                {
                ans += ((e[i].d - e[t].d - you) / d2) * e[t].p;
                you = 0;
                t = i;
                flag = 1;
                break;
            }
        if (wh == 10000 || e[i].p < e[wh].p)
        wh = i;
            }
            if (flag)
            continue;
            if (d1 - e[t].d <= c * d2)
            {
                ans += (d1 - e[t].d -you) / d2 * e[t].p;
                break;
            }
            if (wh == 10000)
            {
                printf("No Solution");
                flag2 = 1;
                break;
            }
            else
            {
                ans += c*e[t].p;
                you += (c * d2 - e[wh].d + e[st].d);
                st = wh;
            }
        }
        if (!flag2)
        printf("%.2lf",ans);
    
        return 0;
    }
     
  • 相关阅读:
    CQUOJ 10819 MUH and House of Cards
    CQUOJ 9920 Ladder
    CQUOJ 9906 Little Girl and Maximum XOR
    CQUOJ 10672 Kolya and Tandem Repeat
    CQUOJ 9711 Primes on Interval
    指针试水
    Another test
    Test
    二分图匹配的重要概念以及匈牙利算法
    二分图最大匹配
  • 原文地址:https://www.cnblogs.com/zbtrs/p/7491890.html
Copyright © 2011-2022 走看看