POJ2431
分析:
每个路过的站都可以看成是随时想加油就加油的站,用堆维护路过的站的储油量。O(nlgn)
代码
#include <iostream>
#include <cstdio>
#include <cstring>
#include <queue>
#include <algorithm>
using namespace std;
const int maxn = 10005;
int L,P;
pair<int,int> pr[maxn];
int main()
{
int n,res;
while(~scanf("%d",&n))
{
priority_queue<int> pq;
res=0;
for(int i=1;i<=n;i++)
{
scanf("%d%d",&pr[i].first,&pr[i].second);
}
scanf("%d%d",&L,&P);
pr[0].first=0,pr[n+1].first=L;
for(int i=1;i<=n;i++)
{
pr[i].first=L-pr[i].first;
}
sort(pr+1,pr+2+n);
int nowpos=0,nowoil=P;//当前的位置 当前的剩余oil
bool sign=0;
while(1)
{
while(nowpos<=n&&nowoil>=pr[nowpos+1].first-pr[nowpos].first) //如果有下一个站且当前剩余oil够到下一个站
{
nowoil-=pr[nowpos+1].first-pr[nowpos].first;
pq.push(pr[nowpos+1].second);
nowpos++;
}
if(nowpos>n) {sign=1;break;}//如果到达了终点则有解退出
if(pq.size())
{
res++;
nowoil+=pq.top();
pq.pop();
}
else break;//如果无论如何也不能到达下一个站则无解退出
}
if(sign) cout<<res<<endl;
else cout<<-1<<endl;
}
return 0;
}