这题书上说要优先队列,然后看了一下,试着敲了一下,一敲就是这么久
#include<iostream>
#include<algorithm>
#include<queue>
using namespace std;
int b[100020];
int c[100020];
struct point
{
int d;
int c;
friend bool operator<(point a,point b) //重载< 友元函数,而且只能重载<符号
{
return a.c<b.c; //大的值在堆上面,用<,否则用>;
}
}p[100010];
bool cmp(point a,point b)
{
return a.d<b.d;
}
priority_queue<point>pq;
int main()
{
int n;
cin>>n;
int i,j;
int x,y;
for(i=1;i<=n;i++)
{
cin>>p[i].d>>p[i].c;
}
cin>>x>>y;
for(i=1;i<=n;i++)
{
p[i].d=x-p[i].d;
}
p[0].d=x;
p[0].c=0;
sort(p,p+n+1,cmp);
for(i=n;i;i--)
{
p[i].d=p[i].d-p[i-1].d;
}
int pos=0;
int ans=0;
int tank=y;
for(i=0;i<=n;i++)
{
if(tank<p[i].d)
{
while(tank<p[i].d)
{
if(pq.size()==0)
{
cout<<"-1"<<endl;
return 0;
}
tank+=pq.top().c;
ans++;
pq.pop();
}
}
tank-=p[i].d;
pq.push(p[i]);
}
cout<<ans<<endl;
}