加油站贪心问题

该文描述了一个算法问题,涉及到汽车行驶和加油策略。给定汽车油箱的最大容量、起点到目的地的距离、单位油耗及沿途加油站的信息(包括价格和距离),算法需找出最省钱的行车路线。如果无法到达目的地,则输出汽车能行驶的最大距离。提供的算法首先按距离对加油站排序,然后依次处理每个站,根据油箱容量和油价选择最佳加油策略。
摘要由CSDN通过智能技术生成
题目描述:
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

算法思想:

首先,将各个加油站按距离从近到远排序;

if 最近的加油站距离不为零,则输出最远距离0,结束;

else if 最近的加油站距离为零:

for 每个加油站(从第1个到第N-1个):

if 下一个加油站不可达,则计算并输出最远距离,结束;

if 最大油箱距离内的加油站最便宜的比当前加油站便宜,则在该站加够到该站的油即可;

else

if 当前加油站可达终点,则在该站加够到终点的油即可,计算并输出总开销,结束

else 则在当前站加满油;

对于第N个加油站:

if 该加油站可达终点,则计算并输出总开销,结束;

else 则计算并输出最远距离,结束;

算法实现:

#include <stdio.h>
typedef struct node{
    double price,distance;
}node;
int cmp(node *a,node *b){
    return a->distance>b->distance;
}
int main()
{
    node data[501];
    double Cmax,D,Dvag;
    int N;
    while(scanf("%lf %lf %lf %d",&Cmax,&D,&Dvag,&N)!=EOF){
        for(int i=0;i<N;i++)
            scanf("%lf %lf",&data[i].price,&data[i].distance);
        qsort(data,N,sizeof(node),cmp);
        int ret=0;//本组样例是否已完成输出
        double remain=0;//剩余油量
        double cost=0;//当前花销
        if(data[0].distance!=0){
            printf("The maximum travel distance = 0.00\n");
            ret=1;
        }else{
            int goMax=Cmax*Dvag;
            for(int i=0;i<N-1;i++){
                if(data[i+1].distance>data[i].distance+goMax){
                    printf("The maximum travel distance = %.2f\n",data[i].distance+goMax);
                    ret=1;
                    break;
                }
                int min=i,j=i+1;
                while(data[j].distance<=data[i].distance+goMax){
                    if(data[j].price<data[min].price)
                        min=j;
                    j++;
                }
                if(min!=i){
                    int needOil=(data[min].distance-data[i].distance)/Dvag;
                    if(remain<needOil){
                        cost+=(needOil-remain)*data[i].price;
                        remain=0;
                    }else{
                        remain-=needOil;
                    }
                    i+=(min-i-1);
                }else{
                    if(data[i].distance+goMax>=D){
                        int needOil=(D-data[i].distance)/Dvag;
                        if(remain<needOil)
                            cost+=(needOil-remain)*data[i].price;
                        break;
                    }else{
                        cost+=(Cmax-remain)*data[i].price;
                        int needOil=(data[i+1].distance-data[i].distance)/Dvag;
                        remain=Cmax-needOil;
                    }
                }
            }
            if(data[N-1].distance+goMax>=D){
                int needOil=(D-data[N-1].distance)/Dvag;
                if(remain<needOil)
                    cost+=(needOil-remain)*data[N-1].price;
            }else{
                printf("The maximum travel distance = %.2f\n",data[N-1].distance+goMax);
                ret=1;
            }
        }
        if(ret==0)
            printf("%.2f\n",cost);
    }
    return 0;
}

投入了4个小时,还没能完全做对,要说收获,应该就是探索和专注带来的宁静吧~

加油站问题是一个经典的贪心算法问题,可以使用贪心算法得到最优解。 问题描述如下:有一辆油箱容量为C的汽车从起点出发,需要行驶距离为D的路程,沿途有n个加油站,第i个加油站距离起点的距离为di,加油站提供的油量为vi,汽车每行驶1个单位距离需要消耗1单位油量。假设汽车初始油量为0,且每个加油站油量无限,问汽车是否可以到达终点。 解题思路:对于每个加油站,我们需要判断是否需要在该加油站加油,如果需要,在该加油站加足最少的油量,以保证到达下一个加油站时还有足够的油量。如果在某个加油站加不了足够的油量,那么汽车无法到达终点。在每个加油站加油的油量可以使用贪心策略,即在当前所有能够到达的加油站中,选择可以加最多油量的加油站加油。 以下是Python代码实现: ```python def gas_station(C, D, n, d, v): # 记录当前油量和已走的距离 cur_gas = 0 cur_dis = 0 # 记录加油次数 count = 0 # 当前能够到达的加油站 stations = [] for i in range(n): # 计算当前加油站距离和起点的距离 dis = d[i] - cur_dis # 如果当前油量不足以到达该加油站 while cur_gas < dis: # 如果没有加油站可以到达,返回False if not stations: return False # 在所有能够到达的加油站中,选择可以加最多油量的加油站加油 max_gas = max(stations) cur_gas += max_gas # 记录加油次数 count += 1 # 更新当前能够到达的加油站 stations.remove(max_gas) # 更新当前油量和已走的距离 cur_gas -= dis cur_dis = d[i] # 将该加油站加入当前能够到达的加油站列表中 stations.append(v[i]) return count ``` 其中,C表示油箱容量,D表示需要行驶的距离,n表示加油站数量,d和v分别表示每个加油站距离起点的距离和提供的油量。函数返回加油次数,如果无法到达终点则返回False。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值