POJ2431

该博客分析了POJ2431问题,提出利用贪心策略,当车辆燃料耗尽时选择提供最大加油量的加油站,以达到最少加油次数的目标。解决方案中涉及使用优先队列来存储和选取最大加油量。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

传送门:http://poj.org/problem?id=2431

【分析】。因为希望加油次数尽可能少,所以当燃料为0了之后再加油是最好的选择。基于贪心的思想,当燃料为0时,选择能加油量最大的加油站。所以可以用一个优先队列来保存经过的加油站的油量,当需要加油时,取出队列中的最大元素即可。

#include <cstdio>
#include <iostream>
#include <queue>
#include <algorithm>
using namespace std;

const int kMaxn = 10000 + 10;

struct aa 
{
    int d,v;
}a[kMaxn];

bool cmp(aa x, aa y) 
{
    return x.d < y.d;
}
int main() 
{
    int n;
    while(~scanf("%d", &n)) 
	{
        for(int i = 1; i <= n; i++)
            scanf("%d %d", &a[i].d, &a[i].v);
        int l,p;
        scanf("%d %d", &l, &p);
        for(int i = 1; i <= n; i++)   
            a[i].d = l - a[i].d;     //把这个加油站到起点的距离变成加油站到终点的距离
        sort(a + 1, a + 1 + n, cmp); //离终点按从近到远等于离起点从远到近,离起点距离要从大到小
		for(int i=1;i<=n;i++)
		{
			cout<<a[i].d<<" ";
		}
        n++; 
        a[n].d = l;       //把终点也认为是加油站,方便写程序
        priority_queue<int>Q;  //优先队列Q
        int pos = 0;  //起点
        bool flag = true; 
        int sum = 0;  //加油站数量
        for(int i = 1; i <= n; i++) 
		{
            p = p - (a[i].d - pos);    //让剩余的油等于能到下一个加油站。
            pos = a[i].d;              //起点等于这个加油到终点的距离、
            while(p < 0)             //不断加油直到油量足够行驶到下一个加油站
			{                        //剩下的油能够到下一个加油站,则不用加油,直接把这个加油站的油加入到队列
                if(Q.empty())   //全加完了都 不足以到终点       
				{
                    flag = false;
                    break;
                }
                p += Q.top();     
                Q.pop();
                sum++;
            }
            if(!flag)
                break;
            Q.push(a[i].v);     
        }
        if(!flag)
            printf("-1\n");
        else 
            printf("%d\n", sum);
    }
    return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值