题目描述
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<cstdio>
#include<iostream>
#include <algorithm>
#include <cstring>
using namespace std;
const int N=10000+1000;
struct node
{
long long len,m;
}a[N];
bool cmp(node a,node b)
{
return a.len<b.len;
}
long long f[N],T;
int main()
{
long long n,k;
while(cin>>n&&n)
{
T=1;
long long L,P,lend,lcpy=0,sum=0;
memset(f,0,sizeof(f));
memset(a,0,sizeof(a));
for(int i=1;i<=n;i++)
{
cin>>a[i].len>>a[i].m;
}
cin>>L>>P;
for(int i=1;i<=n;i++)
{
a[i].len=L-a[i].len;
}
sort(a+1,a+n+1,cmp);
lcpy=P;
int i=0;
while(lcpy<L)
{
int i,Max=0,k=-1;
for(i=1;a[i].len<=lcpy;i++)
{
if(a[i].m>Max&&f[i]!=1)
{
k=i;
Max=a[i].m;
}
}
if(k==-1)
{
T=0;
cout<<-1<<"\n";
break;
}
f[k]=1;
lcpy+=a[k].m;
sum++;
}
if(T)
cout<<sum<<"\n";
}
return 0;
}