POJ 2431 Expedition 貪心
阿新 • • 發佈:2017-07-16
view 貪心 b- string define 分享 ret queue algo
題意:一輛汽車由起點開往小鎮,總路程為L,路上有N個加油站,第i個加油站距離小鎮a[i],最多可為提供b[i]的汽油,汽車開始時有P單位汽油,問汽車內否到達小鎮,若能到達輸出最小的加油次數。
思路:每經過一個加油站i,汽車就獲得了一次在任何時候加油b[i]的權利,當汽車不足以到達下一站時,就加入過往的最大的b值。
#include<stdio.h> #include<queue> #include<iostream> #include<algorithm> #include<math.h> #include<stringView Code.h> #define INF 0x3f3f3f3f #define LL long long #define MOD 100000007 #define MAXSIZE 20005 using namespace std; struct node { int a,b; }p[MAXSIZE]; int cmp(struct node A,struct node B) { if(A.a != B.a) return A.a < B.a; return A.b > B.b; } int Solve(int n,int l,int k) { priority_queue<int> Q; int ans=0,pos=0,hav=k; for(int i=0;i<=n;i++) { int d = p[i].a - pos; while(hav - d < 0) { if(Q.empty()) { return -1; } hav += Q.top(); Q.pop(); ans++; } hav-= d; pos = p[i].a; Q.push(p[i].b); } return ans; } int main() { int n,l,k; while(scanf("%d",&n)!=EOF) { for(int i=0;i<n;i++) { scanf("%d%d",&p[i].a,&p[i].b); } scanf("%d%d",&l,&k); for(int i=0;i<n;i++) p[i].a = l - p[i].a; p[n].a = l; p[n].b = 0; sort(p,p+n,cmp); int ans = Solve(n,l,k); printf("%d\n",ans); } return 0; }
POJ 2431 Expedition 貪心