5月5日

poj2431

题意:卡车开车到距离L个单位的地方,每开一个单位用1的油,路上共有n个加油站,距离终点a[i]的地方加油站可以加b[i]的油,问最少加多少次油可以到达终点

分析:我们可以这样考虑,在到达加油站i时,就获得了一次在之后任何时候都可以加bi的权力,而在之后需要加油时,就认为是在之前经过的加油站加的油就可以了。这样我们在用一个优先队列进行维护即可,注意给出的数据是距离终点的距离

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <cstring>
 4 #include <string>
 5 #include <vector>
 6 #include <algorithm>
 7 #include <set>
 8 #include <map>
 9 #include <bitset>
10 #include <cmath>
11 #include <queue>
12 #include <stack>
13 using namespace std;
14 const int maxn=1e5+5;
15 typedef pair<int,int> point;
16 point s[maxn];
17 int l,p,n;
18 bool cmp(point x,point y)
19 {
20     return x.first<y.first;
21 }
22 int main()
23 {
24     int n;
25     while(cin>>n)
26     {
27         for(int i=0;i<n;i++){
28             scanf("%d%d",&s[i].first,&s[i].second);
29         }
30         cin>>l>>p;
31         for(int i=0;i<n;i++){
32             int t=l-s[i].first;
33             s[i].first=t;
34         }
35         s[n].first=l,s[n].second=0;
36         sort(s,s+n,cmp);
37         int i=0,cnt=0;
38         priority_queue<int> que;
39         while(!que.empty())  que.pop();
40         while(i<=n){
41             while(p<s[i].first&&!que.empty()){
42                 p+=que.top();
43                 que.pop();
44                 cnt++;
45             }
46             if(p<s[i].first) break;
47             while(s[i].first<=p&&i<=n){
48                 que.push(s[i].second);
49                 i++;
50             }
51         }
52 //        cout<<p<<endl;
53         if(p>=l)  cout<<cnt<<endl;
54         else  cout<<"-1"<<endl;
55     }
56     return 0;
57 }
View Code

 

posted @ 2016-05-05 17:25  wolf940509  阅读(129)  评论(0编辑  收藏  举报