题目链接:http://poj.org/problem?id=2431
优先队列解就好了,预处理有点繁琐,不过处理好了就ojbk。
/*
qq:1239198605
ctgu_yyf
*/
#include<iostream>
#include<cstdio>
#include<string>
#include<vector>
#include<queue>
#include<stack>
#include<cstring>
#include<algorithm>
#include<cmath>
#define ll long long
using namespace std;
priority_queue<int,vector<int>,less<int> >p;
struct Node{
int distance;
int oil;
int oilr;
int distancer;
}node[10005];
//结构体排序
bool cmp(const Node &a,const Node &b)
{
return a.distance<b.distance;
}
int main()
{
ios::sync_with_stdio(false);
int n;
cin>>n;
for(int i=0;i<n;i++)
cin>>node[i].distance>>node[i].oil;
int dis,oilx,kk=0;
cin>>dis>>oilx;
for(int i=0;i<n;i++)
node[i].distance=dis-node[i].distance;
sort(node,node+n,cmp);
//预处理
kk=node[0].distancer=node[0].distance;
for(int i=1;i<n;i++)
{
node[i].distancer=node[i].distance-node[i-1].distance;
kk+=node[i].distancer;}
node[n].distancer=dis-kk;
for(int i=1;i<=n;i++)
node[i].oilr=node[i-1].oil;
int ans=oilx-node[0].distancer;
int j=0;
int sum=0;
//优先队列
for(int i=1;i<=n;i++)
{
p.push(node[i].oilr);
if(ans<node[i].distancer)
{
while(!p.empty())
{
ans+=p.top();
p.pop();
sum++;
if(ans>=node[i].distancer)
break;
}
}
ans-=node[i].distancer;
if(ans<0)
break;
}
if(ans<0)
cout<<"-1"<<endl;
else
cout<<sum<<endl;
return 0;
}