码迷,mamicode.com
首页 > 其他好文 > 详细

Expedition

时间:2019-08-24 09:39:43      阅读:86      评论:0      收藏:0      [点我收藏+]

标签:opera   现在   define   puts   sort   ble   stop   fine   size   

Expedition

给出n+1个整点\(\{x_i\}\)(保证递增排序),一个司机带着初始油量p,从\(x_{n+1}\)出发,每行驶一个单位长度消耗一个油量,其中\(x_1\sim x_n\)为加油站,到达第i个加油站,可以选择获得油量\(a_i\)(不允许重复加油),询问其实你可以这样理解\(a_{n+1}=p\),开始油量为0,询问司机是否能到达原点,如果可以的话,请问最少的加油次数,\(n\leq 10000,1 <= P <= 1,000,000,x_{n+1}\leq 10^6,max(a_i)\leq 100\)

对于是否可以满足,显然从从右往左扫描,模拟一下即可。

考虑贪心,从右往左扫描,位置当前为x,显然对于现在所有的油量p,可以到达的范围为\([p-x,p]\),接下来我要走的更远,然后就能保证加油次数最少,显然需要取得这个位置范围中油量最大的加油站,设其有油量\(a\),然后可以到达的范围就变为\([p-x-a,p]\),然后\(++ans\),如果原点被这个范围所包括,那么就可以输出答案。

这样就得到一个\(O(n^2)\)做法,显然对于范围中最大的加油站不能暴力扫描,我们可以利用堆动态维护她,然后就可以做到\(nlog(n)\)

参考代码:

#include <iostream>
#include <cstdio>
#include <algorithm>
#define il inline
#define ri register
#define Size 15000
using namespace std;
template<class free>
struct heap{
    free a[Size];int n;
    il void push(free x){
        a[++n]=x;ri int p(n);
        while(p>1)
            if(a[p]>a[p>>1])
                swap(a[p>>1],a[p]),
                    p>>=1;
            else break;
    }
    il void pop(){
        a[1]=a[n--];ri int p(1),s(2);
        while(s<=n){
            if(s<n&&a[s+1]>a[s])++s;
            if(a[s]>a[p])
                swap(a[s],a[p]),
                    p=s,s<<=1;
            else break;
        }
    }
};
struct stop{
    int x,p;
    il bool operator<(const stop&a){
        return p>a.p;
    }
}s[Size];
heap<int>H;
il void read(int&);
il bool comp(const stop&,const stop&);
int main(){
    int n;read(n);
    for(int i(1);i<=n;++i)
        read(s[i].x),read(s[i].p);
    sort(s+1,s+n+1,comp);
    int x,p,ans(-1);read(x),read(p),H.push(p);
    while(true){
        if(!H.n)break;
        x-=H.a[1],++ans,H.pop();if(x<=0)break;
        while(s[n].x>=x&&n)H.push(s[n].p),--n;
    };
    if(x>0)puts("-1");
    else printf("%d",ans);
    return 0;
}
il bool comp(const stop&a,const stop&b){
    return a.x<b.x;
}
il void read(int &x){
    x^=x;ri char c;while(c=getchar(),c<'0'||c>'9');
    while(c>='0'&&c<='9')x=(x<<1)+(x<<3)+(c^48),c=getchar();
}

Expedition

标签:opera   现在   define   puts   sort   ble   stop   fine   size   

原文地址:https://www.cnblogs.com/a1b3c7d9/p/11403447.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!