poj2431 Expedition

本文介绍了一个使用C++解决的典型算法问题——加油站问题。该问题的目标是在给定的路程中确定最少的加油次数。文章通过代码展示了如何利用优先队列实现最优解,并详细解释了算法流程。

题目连接

#include<stdio.h>  
#include<queue>  
#include<algorithm>  
using namespace std;  
struct stop  
{  
    int x;  
    int v;  
}s[10010];  
bool comp(stop s1, stop s2)  
{  
    return s1.x < s2.x;  
}  
int main()  
{  
    int n, i, L, P;  
    while(~scanf("%d",&n))  
    {  
        for(i = 0; i < n; i++)  
            scanf("%d%d",&s[i].x, &s[i].v);  
        scanf("%d%d",&L,&P);  
        for(i = 0; i < n; i++)  
            s[i].x = L - s[i].x; //转化为加油站到起点的距离  
        s[n].x = L;  
        s[n++].v = 0; //把终点也认为是加油站  
        sort(s, s+n, comp);  
        priority_queue<int, vector<int>, less<int> > Q; //值大的优先  
        int rest = P; //剩余油量  
        int ans = 0; //加油次数  
        int pos = 0; //卡车所在的上一个位置  
        for(i = 0; i < n; i++)  
        {  
            int dis = s[i].x - pos; //从上个加油站到此位置要行驶的距离  
            while(rest - dis < 0) //剩余油量不能到达此位置  
            {  
                if(Q.empty()) //没有油可加  
                {  
                    ans = -1;  
                    break;  
                }  
                rest += Q.top();  
                Q.pop();  
                ans++;  
            }  
            if(ans == -1)  
                break;  
            rest = rest - dis;  
            pos = s[i].x;  
            Q.push(s[i].v);  
        }  
        printf("%d\n",ans);  
    }  
    return 0;  
}  

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值