思路:
有油的时候能走多远就走多远,看能否走到目的地。
如果走不到,就必须要加一次油,途中会遇到很多加油站,一定要选油最多的那个。
这很容易理解,因为如果你只加这一次,越多当然越好。如果要以后还要加,那能走远一点选择也多一点。
重复这样的过程就可以求解了。可以用堆维护加油站中的油量。
杯具:稍稍修改了一下堆的写法,结果WA两次。。
代码:
#include <stdio.h>
#include <stdlib.h>
#define MAX_N 10032
struct node {
int x, f;
};
struct node stop[MAX_N];
int N, L, P;
int heap[MAX_N], heap_size;
inline void shift_up(int idx)
{
int val = heap[idx];
while (idx > 1 && heap[idx/2] < val) {
heap[idx] = heap[idx/2];
idx /= 2;
}
heap[idx] = val;
}
inline void shift_down(int idx)
{
int val = heap[idx];
while (1) {
idx *= 2;
if (idx > heap_size)
break;
if (idx + 1 <= heap_size && heap[idx + 1] > heap[idx])
idx++;
if (val >= heap[idx])
break;
heap[idx/2] = heap[idx];
}
heap[idx/2] = val;
}
int cmp(const void *a, const void *b)
{
return ((struct node *)b)->x - ((struct node *)a)->x;
}
inline void push(int val)
{
heap[++heap_size] = val;
shift_up(heap_size);
}
inline void pop()
{
heap[1] = heap[heap_size--];
shift_down(1);
}
int main()
{
int i, x, t;
freopen("e:\\test\\in.txt", "r", stdin);
scanf("%d", &N);
for (i = 0; i < N; i++)
scanf("%d%d", &stop[i].x, &stop[i].f);
scanf("%d%d", &L, &P);
qsort(stop, N, sizeof(stop[0]), cmp);
push(P);
x = L;
i = 0;
for (t = 0; heap_size && x > 0; t++) {
x -= heap[1];
pop();
while (i < N && x <= stop[i].x)
push(stop[i++].f);
}
printf("%d\n", x <= 0 ? t - 1 : -1);
return 0;
}