第二章 2.4:
POJ 2431 :思路:希望到达终点加油次数最少,当燃料为零的时候再加 看上去是一个最优解
首先判断当前车辆能走到哪里,在走过路径途径过的加油站中选择 加油量最大的加。
在达到加油站i时 认为获得了一次 在这之后任何时候 都可以加Bi单位汽油的权利
#include <iostream>
#include <algorithm>
using namespace std;
#include <queue>
const int M = 1e5;
int L,P,N;
int a[M],b[M];
int main ()
{
scanf("%d%d%d",&N,&L,&P);
for (int i=0;i<N;i++)scanf("%d",&a[i]);
for (int i=0;i<N;i++)scanf("%d",&b[i]);
a[N]=L;
b[N]=0;
priority_queue<int> que; //存储路途中经过的汽油站的Bi
int res = 0,pos=0,tank=P;
for (int i=0;i<N;i++)
{
int d = a[i]-pos; // 下一个油站的距离
while (tank<d) //当到达不到下一个加油站时
{
if(que.empty())
{
puts("-1");
return 0;
}
tank+=que.top(); // 加上途中经过加油站的最大值
que.pop(); //弹出最大值表示已被加过
res++;
}
que.push (b[i]); 加入一个新的加油站
tank-=d; //到达下一个加油站
pos=a[i]; //当前位置更新
}
printf ("%d\n",res);
return 0;
}