POJ2431 Expedition

本文介绍了一个卡车穿越丛林送牛的问题,采用优先队列实现最优加油策略,确保最少加油次数完成任务。详细阐述了算法思路和步骤,并提供了完整的C++代码。

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

题目大意:用卡车将一群牛穿过丛林送到一个小镇上,途中有N个加油站,每个加油站的距离和油量确定,卡车的邮箱容量无限,总距离为L,初始油量为P,求途中最少加油的次数,若无法到达则输出-1.注意:每经过一个单位的距离消耗一个单位的油量。


思路:可以想象一下,每次经过一个加油站Ai的时候,就相当于获得了一次在任意时刻加Bi油量的机会。则每当油箱中油量为0的时候,可以加所经过的最大的Bi,则加油的次数自然最小。


步骤:

1.priority_quequ优先序列,每当经过加油站Ai的时候,将Bi放入quequ队列。

2.所给出的距离均为加油站离小镇的距离,故可以转化成加油站到出发点的距离,并从小到大排列。

3.每到一个加油点之前,先判断是否能够到此加油点,不能的话,则在队列中找到最大的加油量,队列为空的话则输出-1;若不为空,则加一次油,油量为队列中的最大值。再将当前位置,油量,队列等数据更新。


代码如下:

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

struct node
{
	int len,cp;
}a[10000+10];
bool comp(node a,node b)
{
	return a.len>b.len;
}

int main()
{
	priority_queue<int> que;
	int N,L,P,i;
	while(cin>>N)
	{
		for(i=0;i<N;i++)
			cin>>a[i].len>>a[i].cp;
		sort(a,a+N,comp);
		cin>>L>>P;//L为总距离,P为刚开始邮箱中的油量
		for(i=0;i<N;i++)
			a[i].len=L-a[i].len;
		a[N].len=L;
		a[N].cp=0;
		int pos=0,cap=P,dis,count=0;//pos为当前位置,cap为油箱容量,dis为到下一加油点的距离,count为加油次数
		for(i=0;i<=N;i++)
		{
			dis=a[i].len-pos;
			while(cap<dis)
			{
				if(que.empty())
				{
					count=-1;
					break;
				}
				cap+=que.top();
				que.pop();
				count++;
			}
			if(count==-1)break;
			cap-=dis;
			pos=a[i].len;
			que.push(a[i].cp);
		}
		cout<<count<<endl;
	}
	return 0;
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值