细节上wa了n发。。。优先队列。把经过的加油站的油量先存着,需要的时候取最多的那个。用优先队列即可以实现。注意给的距离是到终点的距离。。。以为我初始代码按到 起点距离写的,所以就拿l减了一下。注意排序。。。毕竟没说是不是按顺序的。。。还有queue的清零POJ - 2431
#include<cstdio>
#include<iostream>
#include<queue>
#include<algorithm>
using namespace std;
#define maxn 1000001
#define SC(a,b) scanf("%lld%lld",&a,&b)
typedef long long LL;
struct My
{
LL dis,num;
}arr[maxn];
bool cmp(My a, My b)
{
return a.dis<b.dis;
}
//LL a[maxn],b[maxn];
int main()
{
LL n;LL l,p;
while(~scanf("%lld",&n))
{
for(int i=0;i<n;i++)
SC(arr[i].dis,arr[i].num);
SC(l,p);bool flag=0;
for(int i=0;i<n;i++)
{
arr[i].dis=l-arr[i].dis;
// cout<<a[i]<<endl;
}
priority_queue<LL> Q;
while(!Q.empty()) Q.pop();
LL ans=0;
sort(arr,arr+n,cmp);
for(int j=0;j<n;j++)
{
if(p<arr[j].dis&&Q.empty())
{
flag=1;
break;
}
else if(p<arr[j].dis&&!Q.empty())
{
while(p<arr[j].dis&&!Q.empty())
{
p+=Q.top();
ans++;
Q.pop();
}
if(p<arr[j].dis)
{
flag=1;
break;
}
}
Q.push(arr[j].num);
if(arr[j].dis>=l) break;
}
if(p<l)
{
while(!Q.empty()&&p<l)
{
p+=Q.top();
Q.pop();
ans++;
}
if(p<l) flag=1;
}
printf("%lld\n",flag?-1:ans);
}
}