这个题注意几点:
1、《挑战程序设计竞赛》上的代码并不能适用此题,这里的a[i]是到终点的距离
2、注意要排序!这里给出的a[i]并不一定是按顺序给的(只有WA过才会明白有多坑)
#include <cstdio>
#include <iostream>
#include <cstring>
#include <algorithm>
#include <queue>
using namespace std;
struct po
{
int x,y;
}a[20000];
bool cmp(po a,po b)
{
return a.x < b.x;
}
int main()
{
priority_queue<int>q;
int n,l,p;
scanf("%d",&n);
for(int i = 1; i <= n; i ++)
{
scanf("%d%d",&a[i].x,&a[i].y);
}
scanf("%d%d",&l,&p);
sort(a+1,a+n+1,cmp);
int st=0;int j = n;
int ans = 0;
while(st < l&&j>=0)
{
if(p <= 0)
{
if(q.empty())
{
puts("-1");
return 0;
}
p+= q.top();
q.pop();
ans ++;
}
st ++;
p --;
if(st == (l-a[j].x))
{
if(a[j].y!=0)
q.push(a[j].y);
j--;
}
}
printf("%d\n",ans);
return 0;
}