zoukankan      html  css  js  c++  java
  • 九度OJ #1437 To Fill or Not to Fil

    题目描写叙述:

    With highways available, driving a car from Hangzhou to any other city is easy. But since the tank capacity of a car is limited, we have to find gas stations on the way from time to time. Different gas station may give different price. You are asked to carefully design the cheapest route to go.

    输入:

    For each case, the first line contains 4 positive numbers: Cmax (<= 100), the maximum capacity of the tank; D (<=30000), the distance between Hangzhou and the destination city; Davg (<=20), the average distance per unit gas that the car can run; and N (<= 500), the total number of gas stations. Then N lines follow, each contains a pair of non-negative numbers: Pi, the unit gas price, and Di (<=D), the distance between this station and Hangzhou, for i=1,...N. All the numbers in a line are separated by a space.

    输出:

    For each test case, print the cheapest price in a line, accurate up to 2 decimal places. It is assumed that the tank is empty at the beginning. If it is impossible to reach the destination, print "The maximum travel distance = X" where X is the maximum possible distance the car can run, accurate up to 2 decimal places.

    例子输入:
    50 1300 12 8
    6.00 1250
    7.00 600
    7.00 150
    7.10 0
    7.20 200
    7.50 400
    7.30 1000
    6.85 300
    50 1300 12 2
    7.10 0
    7.00 600
    例子输出:
    749.17
    The maximum travel distance = 1200.00
    来源:

    2012年浙江大学计算机及软件project研究生机试真题


    这道题确实挺难的,花了好久的时间,然后自己考虑不全面,最后參考别人的代码才搞定。

    就不敢写原创了。。。


    http://ziliao1.com/Article/Show/73A96AF77079A6C32C4AA82604FCF691


    典型的贪心法。

    思想就是考虑下一次在何网站加油(从而决定了在本网站须要加多少油)。

    考虑这样几种情况:

         1、到达下一网站所需油量 > 油箱最大容量:则下一网站不可达。做法是把油箱加满,尽可能跑,然后break掉。

         2、下一网站可达,且油价比本网站廉价:则应尽早“换用”更廉价的油。做法是本站加够就可以。使得刚好能到达下一站。

         3、下一网站可达。但油价比本网站贵:此处第一次做错了,不应该在本站把油箱加满,而应该继续寻找满油的条件下可达的下一个比本站廉价的网站。若找到,则加够就可以(所以情况2能够并到这里);若未找到,则在本站将油箱加满。

    #include <algorithm>
     
    #include <iomanip>
    #include <iostream>
    using namespace std;
    struct station
    {
    float price;
    float dist;
    };
    station st[501];
    float cmax, d, davg;
    int n;
    bool cmp(station a, station b)
    {
    return a.dist < b.dist;
    }
    // 寻找下一个可达的廉价网站
    int nextCheaper(int now)
    {
    for(int i = now; i < n; i++)
    {
    if(st[i].dist - st[now].dist > cmax * davg) break;
    if(st[i].price < st[now].price)
    return i;
    }
    return -1;
    }
    int main()
    {
    while(cin >> cmax)
    {
    cin >> d >> davg >> n;
    for(int i = 0; i < n; i++)
    cin >> st[i].price >> st[i].dist;
    st[n].price = -1; st[n].dist = d;
    n = n + 1;
    sort(st, st + n, cmp);
    int nowst = 0;
    float nowgas = 0;
    float cost = 0;
    while(nowst < n - 1)
    {
    if(nowst == 0 && st[0].dist != 0)
    {
    st[nowst].dist = 0; break;
    }
    float needgas = (st[nowst + 1].dist - st[nowst].dist) / davg;
    if(needgas > cmax)
    {
    float addgas = cmax - nowgas;
    cost += addgas * st[nowst].price;
    st[nowst].dist += cmax * davg;
    break;
    }
    int nextc = nextCheaper(nowst);
    if(nextc == -1)
    {
    float addgas = cmax - nowgas;
    nowgas = cmax;
    cost += addgas * st[nowst].price;
    nowgas -= needgas;
    nowst = nowst + 1;
    }else{
    needgas = (st[nextc].dist - st[nowst].dist) / davg;
    float addgas = needgas - nowgas;
    if(addgas > 0)
    {
    nowgas += addgas;
    cost += addgas * st[nowst].price;
    }
    nowgas -= needgas;
    nowst = nextc;
    }
    }
    if(nowst == n - 1)
    cout << fixed << setprecision(2) << cost << endl;
    else{
    float maxdist = st[nowst].dist;
    cout << "The maximum travel distance = "<< fixed << setprecision(2) << maxdist << endl;
    }
    }
    return 0;
    }

    以下是我模仿大神自己手写的代码,差点儿都改动的全然一样了。。。眼下还是过不了。郁闷

    有时间再研究一下啦。。。如今 真的发现不了什么错误了

    #include <iostream>
    #include <cstdio>
    #include <algorithm>
    using namespace std;
    struct station
    {
        float pri;
        float dis;
    }a[999];
    int c,d,davg,n;
    int cmp(station t1,station t2)
    {
        return t1.dis<t2.dis;
    }
    int next(int now)
    {
        for(int i=now+1;i<=n&&a[i].dis-a[now].dis<=c*davg;i++)
        {
            if(a[i].pri<a[now].pri)
                return i;
        }
        return -1;
    }
     
    int main()
    {
        int i;
        while(cin>>c>>d>>davg>>n)
        {
            for(i=0;i<n;i++)
            {
                scanf("%f %f",&a[i].pri,&a[i].dis);
            }
            a[n].pri=-1;
            a[n].dis=d;
            sort(a,a+n,cmp);
           // for(i=0;i<n;i++)
            //printf("%f %f
    ",a[i].dis,a[i].pri);
            int nowst=0;
            float anspri=0,ansdis=0,nowgas=0;
            while(nowst<n)
            {
                if(nowst==0&&a[0].dis!=0)
                {
                    ansdis=0;
                    break;
                }
                float needgas=(a[nowst+1].dis-a[nowst].dis)/davg;
                if(needgas>c)
                {
                    ansdis+=davg*c;
                    break;
                }
                int nextst=next(nowst);
             //   printf("%d %d %f
    ",nowst,nextst,anspri);
                if(nextst==-1)
                {
                    anspri+=(c-nowgas)*a[nowst].pri;
                    nowgas=c-needgas;
                    ansdis=a[nowst+1].dis;
                    nowst+=1;
     
                }
                else
                {
                   float addgas=(a[nextst].dis-a[nowst].dis)/davg-nowgas;
                   if(addgas>0)
                   {
                       nowgas=0;
                       anspri+=addgas*a[nowst].pri;
                   }
                   else
                       nowgas-=needgas;
     
                    nowst=nextst;
                    ansdis=a[nowst].dis;
     
                }
            }
            if(nowst==n)
                printf("%.2f
    ",anspri);
            else
                printf("The maximum travel distance = %.2f
    ",ansdis);
        }
        return 0;
    }
     
    /**************************************************************
        Problem: 1437
        User: HCA1101
        Language: C++
        Result: Wrong Answer
    ****************************************************************/


  • 相关阅读:
    k3 cloud中获取自己开发的单据
    k3 cloud列表中出现很多空白
    k3 cloud支付申请单下推付款单时候提示未将对象引用设置到对象的实例
    k3 cloud出现应收单下推收款单,把收款单是结算方式修改成银行承兑汇票之后保存提示:收款单明细中结算方式为票据业务的实收金额之和不等于票据的当前占用金额之和,请检查数据!
    k3 cloud中出现合计和汇总以后没有显示出来,合价要新增一行以后才出现值
    共享打印机
    k3 cloud总账凭证点击保存的时候提示未将对象引用到对应的实例
    k3 cloud成本调整单引入单据后,再做出库成本核算。成本调整单列表已审核的单据消失,非已审核的单据还在,这是出库成本核算设置参数的问题吗?
    K3 cloud选单时候必须把必录的数据录完以后才可以选单
    k3 cloud成本调整单提示期末余额不存在调整单分录的维度,请先出库核算确认是否存在核算维度的数据
  • 原文地址:https://www.cnblogs.com/gcczhongduan/p/5266838.html
Copyright © 2011-2022 走看看