题目描述
Yanwei 是一个旅行家,他有一辆二手越野车,所以他不好好读书就仗着家里有矿四处旅游。可是有次他在野外落难了,他的油箱漏了,而这时他距离城市还有L米的距离,可是他的油箱只有P升的油了,油箱的漏洞不大不小,刚刚好每开1米刚好少去一升油。
万幸的是这里还有N个(1<n=10000)村落可以给他补充汽油M(1<=m<=100)。
而庆幸的是Yanwei买的车的油箱可以装的油量无穷无尽。各个村庄和城市都在一条直线上。
这里很危险,Yanwei希望可以停最少次车到达城市。当然也可能永远都到不了。
输入
L,P均小于1,000,000。
本题有多组输入:
第一行输入一个正整数N代表有多少个村庄。
接下来N行输入两个正整数代表这个村庄到城市的距离和可以补充的汽油M。
最后一行输入L和P
输出
输出最少的停车次数,如果永远不能到城市输出-1。
样例输入
4 4 4 5 2 11 5 15 10 25 10 2 2 1 5 2 6 2
样例输出
2 -1
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
int f[10010];
struct node
{
long long x,y;
}arr[10010];
bool cmp(node u,node v)
{
return u.x<v.x;
}
int main()
{
long long n;
while(cin>>n)
{
long long t=1;
long long ans=0;
memset(f,0,sizeof(f));
memset(arr,0,sizeof(arr));
for(int i=1;i<=n;i++)
cin>>arr[i].x>>arr[i].y;
long long l,p;
cin>>l>>p;
for(int i=1;i<=n;i++)
arr[i].x=l-arr[i].x;//加油站到车的距离
sort(arr+1,arr+n+1,cmp);//按距离从小到大排序
while(p<l)
{
long long Max=0,k=-1;
for(int i=1;arr[i].x<=p;i++)//油的数量要小于距离
{
if(arr[i].y>Max&&f[i]!=1) //最少的停车次数,所以每次都要比前面的油量大并且这个点没被访问过
{
k=i;
Max=arr[i].y;
}
}
if(k==-1)
{
t=0;
cout<<-1<<endl;
break;
}
f[k]=1;
p+=arr[k].y;
ans++;
}
if(t) cout<<ans<<endl;
}
return 0;
}