1. 程式人生 > >POJ 2431 Expedition 貪心

POJ 2431 Expedition 貪心

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<string
.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; }
View Code

POJ 2431 Expedition 貪心