zoukankan      html  css  js  c++  java
  • Expedition

    Expedition

    给出n+1个整点({x_i})(保证递增排序),一个司机带着初始油量p,从(x_{n+1})出发,每行驶一个单位长度消耗一个油量,其中(x_1sim x_n)为加油站,到达第i个加油站,可以选择获得油量(a_i)(不允许重复加油),询问其实你可以这样理解(a_{n+1}=p),开始油量为0,询问司机是否能到达原点,如果可以的话,请问最少的加油次数,(nleq 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();
    }
    
    
  • 相关阅读:
    jQuery全屏滚动插件fullPage.js
    通过定位实现子元素相对于父元素上下左右居中
    TermDocs
    IndexWriter
    lucene demo引出的思考
    第一个LUCENE程序
    lucene3.5的查询语法
    更改只读文件属性为正常
    设置WINDOWS2003服务器的允许外界访问端口,远程桌面的端口更改
    Cookie在域中的读写实现顶级域共享
  • 原文地址:https://www.cnblogs.com/a1b3c7d9/p/11403447.html
Copyright © 2011-2022 走看看