poj 2431

poj 2431

题目大意:

 给定N个加油站

给定N个加油站到终点的距离和给定其对应的油量

给定最终目的地的L距离,给定卡车所有的油量,假设对应的卡车可以装无限多的油

输出需要最少加油的次数

如果无法到达返回-1

思路:

1.卡车只要经过这个油站,就有机会加油,可以选择加或者不加

2.当卡车开过之后发现无法到达下一个目的地,我们可以认为他在之前经过某个加油站的时候就已经加过了油

3.为了让加油次数尽可能少,所以一定在经过的加油站中取最大的那个加油站,直至可以通过下一个站点

利用优先队列实现每次取经过的加油站的最大油值,表示在这个位置加过了油

扫描二维码关注公众号,回复: 4573727 查看本文章
#include<iostream>
#include<queue>
#include<stdio.h>
#include<algorithm>
using namespace std;

struct Node{
    int dis;
    int ful;
};

bool camp(const Node &a,const Node &b){
    return a.dis<b.dis;
}

int main(){
    const int MAXN =10024;
    int N;

    Node array[MAXN];

    int Ns[MAXN];
    int Ps[MAXN];
    int L,P;
    scanf("%d",&N);

    for(int i=0;i<N;i++){
        scanf("%d %d",&array[i].dis,&array[i].ful);
    }
    scanf("%d %d",&L,&P);

    //calculate the distence with start
    for(int i=0;i<N;i++){
        array[i].dis = L - array[i].dis;
    }

    sort(array,array+N,camp);

    for(int i=0;i<N;i++){
        Ns[i] = array[i].dis;
        Ps[i] = array[i].ful;
    }


    Ns[N] = L;
    Ps[N] = 0;
    N++;

    priority_queue<int> que;
    int ans =0;
    int pos =0;
    int tank =P;

    for(int i=0;i<N;i++){
        int d = Ns[i] - pos;

        while(tank - d<0){

            if(que.empty()){
                printf("%d\n",-1);
                return 0;
            }
            tank+=que.top();
            que.pop();
            ans++;
        }

        //pos +=Ns[i];  error
        pos = Ns[i];
        tank-=d;
        que.push(Ps[i]);
    }

    printf("%d\n",ans);

    return 0;
}

cows

牛的复数

grabbed

攫取;捕获;强夺;匆忙地做(grab的过去分词形式

expedition

n. 远征;探险队;迅速

猜你喜欢

转载自blog.csdn.net/Willen_/article/details/84593994