汽车每过一单位消耗一单位油,其中有给定加油站可加油,问到达终点加油的最小次数。
做法很多的题,其中优先对列解这题是很经典的想法,枚举每个加油站,判断下当前油量是否小于0,小于0就在前面挑最大几个直至油量大于0。
虽然是道挺水的题目,但还是要注意细节...
/** @Date : 2017-09-21 22:45:37 * @FileName: POJ 2431 优先队列.cpp * @Platform: Windows * @Author : Lweleth (SoungEarlf@gmail.com) * @Link : https://github.com/ * @Version : $Id$ */ #include <stdio.h> #include <iostream> #include <string.h> #include <algorithm> #include <utility> #include <vector> #include <map> #include <set> #include <string> #include <stack> #include <queue> #include <math.h> //#include <bits/stdc++.h> #define LL long long #define PII pair<int ,int> #define MP(x, y) make_pair((x),(y)) #define fi first #define se second #define PB(x) push_back((x)) #define MMG(x) memset((x), -1,sizeof(x)) #define MMF(x) memset((x),0,sizeof(x)) #define MMI(x) memset((x), INF, sizeof(x)) using namespace std; const int INF = 0x3f3f3f3f; const int N = 1e5+20; const double eps = 1e-8; struct yuu { int x, l; }a[10010]; int n, len, p; int pos[N*10]; int cmp(yuu a, yuu b) { if(a.x != b.x) return a.x > b.x; return a.l > b.l; } int main() { int n; while(~scanf("%d", &n)) { for(int i = 0; i < n; i++) { int x, l; scanf("%d%d", &x, &l); a[i].x = x; a[i].l = l; } a[n].x = 0; a[n].l = 0; sort(a, a + n + 1, cmp); scanf("%d%d", &len, &p); priority_queue<int, vector<int>, less<int> >q; int ans = 0; int pos = 0; for(int i = 0; i <= n; i++) { p -= len - a[i].x - pos; if(p < 0) { while(!q.empty() && p < 0) p += q.top(), q.pop(), ans++; if(p < 0)//这里要退出 忘写了... { ans = -1; break; } } //cout << p << endl; pos = len - a[i].x; q.push(a[i].l); } if(p < 0) cout << -1 << endl; else cout << ans << endl; } return 0; }