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 }