题目
题解思路
贪心思维
走到不能走时,不断用之前走过的能加油的最大值加,加到加不了还是走不到就是-1。
这样只能判断所有加油站能不能到,这时我们在重点设置一个虚拟加油站来进行上面的操作。
寻找最大量加油的过程用优先队列优化。
边走边把能加油的加上。
AC代码
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <queue>
using namespace std;
struct node
{
int t,w;
}a[101000];
int vis[101000];
bool cmp(node A,node B)
{
if ( A.t == B.t )
return A.w > B.w ;
return A.t > B.t;
}
int main ()
{
int n,k,f;
cin>>n;
for (int i = 1 ; i <= n ; i++ )
{
int t1,t2;
cin>>t1>>t2;
a[i].t = t1;
a[i].w = t2;
}
a[n+1].t = 0 ;
a[n+1].w = 0 ;
cin>>k>>f;
sort(a+1,a+2+n,cmp);
if ( k <= f )
cout<<"0\n";
else
{
priority_queue <int> q;
int pit = k-f;
int ans = 0 ,book = 1;
for (int i = 1 ; i <= n+1; i++ )
{
if ( a[i].t >= pit)
{
q.push(a[i].w);
}else
{
while(!q.empty())
{
if ( a[i].t >= pit)
break;
pit -= q.top();
q.pop();
ans++;
}
if ( pit > a[i].t )
{
book = 0;
break;
}
q.push(a[i].w);
}
}
if (book)
cout<<ans<<"\n";
else
cout<<"-1\n";
}
return 0;
}