【贪心】 Expedition

题意

传送门
需要驾车到距离\(L\)的城镇,最开始有\(P\)单位汽油,每行驶1单位距离消耗1单位汽油,如果汽油耗尽则无法行进,路上一共有\(N\)个加油站,第\(i\)个加油站距离城镇\(d_{i}\)个单位,可以加油\(b_{i}\)单位,每个加油站只能加一次,容量无限,求最少的加油次数抵达城镇,如果不能抵达输出-1

数据范围

\(1 \leq N \leq 10000\)
\(1 \leq L \leq 1000000 , 1\leq P \leq 1000000\)
\(1 \leq d_{i} < L , 1\leq b_{i} \leq 100\)

题解

将所有的距离转化一下,加油的时间是在无法抵达当前加油站的时候进行,每次加都贪心的加已经经过的加的最多的

Code

#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
using namespace std;
#define rep(i,a,n) for(int i=a;i=a;i--)
#define fi first
#define se second 
#define ll long long
#define pb push_back
typedef pair pll;
typedef pair pii;
typedef vector vi;
typedef vector vll;
typedef double db;
const ll mod=1e9+7;
ll powmod(ll a,ll b,ll p){ll res=1;a%=p;while(b){if(b&1) res=res*a%p;a=a*a%p;b>>=1;}return res;}
ll gcd(ll a,ll b) {return b?gcd(b,a%b):a;}
const int N=1e4+10;
int n;
int L,P;
pii sta[N];

int main(){
    scanf("%d",&n);
    rep(i,0,n) 
        scanf("%d%d",&sta[i].fi,&sta[i].se);
    scanf("%d%d",&L,&P);
    rep(i,0,n) 
        sta[i].fi=L-sta[i].fi;

    sort(sta,sta+n);
    priority_queueq;
    int ans=0;
    sta[n]=make_pair(L,0);
    n++;
    rep(i,0,n){
        int distance=sta[i].fi,add=sta[i].se;
        while(P < distance){
            if(q.empty()){
                puts("-1");return 0;
            }
            P += q.top();
            q.pop();
            ans++;
        }
        q.push(add);
    }
    printf("%d\n",ans);
}

你可能感兴趣的:(【贪心】 Expedition)