题意:从当前位置到目的地,给出初始油量和距离,给出一系列的加油站离终点的距离和可以加的油量,每走一个单位消耗一个单位油量,求要到达目的地最少要在几个加油站下车加油。
题解:既然是最少,那么尽可能在油消耗完的时候给加油,如果再走a米的路程中注定要加一次油,那么就选择这段路程油量最大的加油站下车
代码实现就是每经过一个加油站将这个加油站的油量存下来, 等到不得不下车加油的时候,就选择储存的这些数据中最大的那个(不一定是在油刚刚消耗完的时候,在那之前也行),并且选择完了以后将这个数据移出。直到到达目的地。
代码如下:
#include <stdio.h> #include <stdlib.h> #include <iostream> #include <algorithm> using namespace std; struct Node { int num; Node* next; }; struct Point { int dist; int fuel; }; Node *root; int n; int L, res; void input(Node *a) { Node *beg = root; while(beg->next != NULL && beg->next->num >= a->num) beg = beg->next; a->next = beg->next; beg->next = a; } bool cmp(const Point a, const Point b) { if(L - a.dist != L - b.dist) return L - a.dist < L - b.dist; return a.fuel < b.fuel; } Node *newnode(){return (Node*)malloc(sizeof(Node*));} int main() { while(scanf("%d", &n) != EOF) { root = (Node *)malloc(sizeof(Node *)); root->num = 0xffffff; root->next = NULL; Point p[10005]; for(int i = 0; i < n; i++) { scanf("%d%d", &p[i].dist, &p[i].fuel); } scanf("%d%d", &L, &res); sort(p, p + n, cmp); Node *n0 = newnode(); n0->num = res; input(n0); int ii = 0; int cango = 0; int ans = -1; while(root->next != NULL) { Node *n1 = root->next; root->next = n1->next; cango += n1->num; //printf("cango = %d ", cango); ans++;if(cango >= L)break; for(; L - p[ii].dist <= cango; ii++) { Node *n0 = newnode(); n0->num = p[ii].fuel; input(n0); } } if(cango < L) cout << "-1" << endl; else printf("%d ", ans); } }
可以用c++中的容器优先队列
priority_queue。