问题 D: Yanwei的冒险

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Genius_panda_ACM/article/details/82049018

题目描述

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;
}

猜你喜欢

转载自blog.csdn.net/Genius_panda_ACM/article/details/82049018