PAT-甲级-1033 To Fill or Not to Fill (贪心)

问题描述:

从杭州开车能到任何地方,但是你会路途上你会需要加油,假设你出发时邮箱没有油,路途上每隔一段距离就有一个加油站,但每个加油站价格不同,你需要选择一条最省钱的加油路线

输入输出:

Sample Input 1:

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

Sample Output 1:

749.17

Sample Input 2:

50 1300 12 2
7.10 0
7.00 600

Sample Output 2:

The maximum travel distance = 1200.00 //因为哪怕到最后一个加油站加满油,也到不了下一个加油站/目的地

思路:

贪心原则,保证下一步的操作我可能不赚,但永远不会亏
先添加一个目标油站,价格为0,距离为目的距离,然后将所有油站输入后按距离sort
之后,对于每一步选择满油能到的油站范围内比当前油站便宜的那个,只加将油加到能到达那个站,重复这个过程,如果能到达的油站范围内没有比现在便宜的,那就加满油,到范围内比较便宜那个(不一定比目前油站便宜)重复上述过程,直至到达目标油站
这样能保证我们车上的油一定是能到达油站中最便宜的
注意:

  • 这里价格浮点数,有浮点数参与的运算,其他值参与运算的也尽量用浮点数

Code:

/*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*/
#include<iostream>
#include<vector>
#include<algorithm>

using namespace std;
#define INT_MAX 0x3f3f3f3f
struct sta{
    double price;
    double dis;
};
bool cmp(sta s1, sta s2)
{
    return s1.dis < s2.dis;
}
int main()
{
    double tank_size, total_dis, KMPL, sta_size; 
    cin>>tank_size>>total_dis>>KMPL>>sta_size;
    vector<sta>stas;
    stas.push_back({0.0, total_dis});
    for(int i = 0; i < sta_size; i++)
    {
        sta temp_s;
        cin>>temp_s.price>>temp_s.dis;
        stas.push_back(temp_s);
    }
    sort(stas.begin(), stas.end(), cmp);
    /*for(auto c:stas) //cout stas
    {
        printf("%.2f",c.price);
        cout<<' '<<c.dis<<endl;
    }*/
    double price_now, sum_spend = 0.00;
    double dis_now = 0, sta_now = 0, oil_now = 0;
    if(stas[0].dis != 0)
    {
        cout<<"The maximum travel distance = 0.00";
        return 0;
    }
    else
        price_now = stas[0].price;
    while(dis_now != total_dis)
    {
            int max_dis_now = tank_size * KMPL + dis_now;
            int min_price = INT_MAX, min_price_sta = sta_now;
            for(int i = sta_now + 1; i < stas.size(); i++)
            {
                if(stas[i].dis <= max_dis_now)
                    if(stas[i].price <= min_price)
                    {
                        min_price = stas[i].price;
                        min_price_sta = i;  
                        if(min_price < price_now) break;
                    }
            }
            if(min_price == INT_MAX)
            {
                cout<<"The maximum travel distance = ";
                printf("%.2f", dis_now + tank_size * KMPL);
                return 0;
            }
                if(min_price < price_now)
                {
               
                   sum_spend += ((stas[min_price_sta].dis - dis_now) / KMPL - oil_now) * price_now; 
                   oil_now = 0;
                }  
                else
                {
                    sum_spend += (tank_size  - oil_now )* price_now;
                    oil_now = tank_size - (stas[min_price_sta].dis - dis_now) / KMPL;
                }
                dis_now = stas[min_price_sta].dis; 
                price_now = stas[min_price_sta].price;
                sta_now = min_price_sta;
                //cout<<sta_now<<endl;
            
    }// while
    printf("%.2f", sum_spend);
    
}

结果:

posted @ 2021-03-26 16:05  liushz  阅读(75)  评论(0)    收藏  举报