题目大意:一部车要从一个地方走到另一个地方,开始的时候车的油箱有P升油,汽车每走1个距离消耗1升油,没有油汽车无法行驶,路上有加油站,可以为汽车加油,设汽车的油缸是无限大小的,问你汽车能否走到终点?如果可以,需要用到最小的加油站的数目是多少?
这一题可以这么理解,因为我们只用最小的加油站数目,那么我们可以只用每次都加最大油量就可以了,我们可以认为汽车经过的加油站都像势能一样储存起来,随时可以加油
那么这样过后,我们只用维护一个最大堆就可以了,也算是一个贪婪算法吧
#include <iostream>
#include <functional>
#include <queue>
#define MAX_N 10001 using namespace std; typedef struct gas
{
int gas_pos;
int gas_sum;
}GS; GS state[MAX_N];
void Search(const int, const int, const int);
int fcmop(const void *a, const void *b)
{
return (*(GS *)b).gas_pos - (*(GS *)a).gas_pos;
} int main(void)
{
int N, L, P;
while (~scanf("%d", &N))
{
for (int i = ; i < N; i++)//读入加油站的油量
scanf("%d%d", &state[i].gas_pos, &state[i].gas_sum);
scanf("%d%d", &L, &P);
state[N].gas_pos = ; state[N].gas_sum = ;//把终点看成油站
qsort(state, N, sizeof(GS), fcmop);//记得成从远到近(距离终点)
Search(L, N, P);
}
return ;
} void Search(const int L, const int N, const int P)
{
priority_queue < int, vector<int>, less<int> > que;
int i, ans = , tank = P, now_state = , dist; for (i = ; i <= N; i++)
{
dist = (L - state[i].gas_pos) - now_state;//下一个油站到现在的距离
while (tank - dist < )//如果不支持到
{
if (que.empty())//没有油站给加油了,直接不能走到终点
{
cout << - << endl;
return;
}
tank += que.top();
que.pop();
ans++;
}
que.push(state[i].gas_sum);//相当于是势能,储存起来
tank -= dist;
now_state = (L - state[i].gas_pos);
}
cout << ans << endl;
}