poj2431遠征(プライオリティキュー)

問題の説明(機械翻訳)

ジャングルの冒険に深くトラックベンチャーをつかむために牛の群れ。これらの牛の貧弱な運転技術のため、残念ながら、彼らは岩にヒットし、トラックの燃料タンクを刺し。今、各トラックは、燃料漏れのある距離の単位を移動します。
トラックを修復するために、牛は、(距離の100万台を超えない)に最も近い町に長く曲がりくねった道に沿って開く必要があります。この道では、町やトラックの現在位置との間で、N(1 <= N <=万がある ) 燃料ステーションは、牛はそこに余分な燃料(1 ... 100)を取得することを停止します。
人間のジャングルは、牛のために特に危険である、危険な場所です。そのため、牛が停止し、燃料を補給するために可能な限り小さな町に来てほしいです。幸いなことに、そのトラックの燃料タンク容量は、実際の燃料量制限なしを収容できるように大きくなります。現在トラック単位町距離L、Pの燃料ユニット(1 <= P <= 1,000,000 )。
町に到達するために、または牛が町に到達できない場合に必要な停止の最小数を決定するには。

エントリー

* 1行目:N単整数
* 2行目.N + 1:各行は、整数で分離された2つのスペースを含む燃料供給ステーションを説明:最初の整数は、ガソリンスタンドまで町からの距離であり、第二サイトです。利用できる燃料の量。
第2の行N + 2 *:整数によって分離された2つのスペースを、LとP

輸出

* 1行目:町を必要とステーションの最小数に到達するために燃料を与える単一の整数。あなたが町に到達できない場合は、出力-1。

サンプル入力

4
4 4
5 2
11 5
15 10
25 10

サンプル出力

2

分析:

明らかに距離を移動することができ、オイルの量
とすべてのステーションを経由しなければならない町に到達するためには、
車両を介してすべてのガソリンスタンドから油を取るためにランダムに選択することができ
、燃料ガスステーションが追加プライオリティキューを通過することができるようになります
油が給油に到達できないとき駅時に
油の過去最大量アウト優先キューからは(石油ああのほとんどの量を取るようにしてください)油pの合計額に加算
まだガソリンスタンドの説明に到達することができないが、町に到達できない場合は引き継ぐためにプライオリティキューの下で

ガソリンスタンドの後、結局まだ町かどうかを判断する必要があり、従来の方法は、油を取るために続けているように、プロセスは同じではありません
ので、この方法で同じである、すべてのガソリンスタンドかどうかを判断するために合併した後、最後の都市ガスステーションとして追加することができますプロセス

コード:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<vector>
#include<cmath>
#include<algorithm>
#include<queue>
typedef long long ll;
const int inf=0x3f3f3f3f;
const int inn=0x80808080;
using namespace std;
const int maxm=1e6+5;
int n,l,p;
struct Node{
    int a,b;
}a[maxm];
int cmp(Node a,Node b){
    return a.a<b.a;
}
int main(){
    while(cin>>n){
        for(int i=1;i<=n;i++){
            cin>>a[i].a>>a[i].b;
        }
        cin>>l>>p;
        for(int i=1;i<=n;i++){
            a[i].a=l-a[i].a;//改为起点到加油站的距离
        }
        sort(a+1,a+1+n,cmp);//距离排序
        a[n+1].a=l;//假设终点为最后一个加油站
        int ans=0;
        priority_queue<int,vector<int>,less<int> >q;
        for(int i=1;i<=n+1;i++){//判断能否经过所有加油站,其实也就是能否到达终点
            if(p>=a[i].a){//如果能够到达这个加油站就把油量加入优先队列
                q.push(a[i].b);
            }else{
                while(!q.empty()){//不断加油
                    if(p<a[i].a){
                        p+=q.top();
                        q.pop();
                        ans++;//加油次数加1
                    }else{
                        break;
                    }
                }
                if(p<a[i].a){//如果加完了还是到不了,那么就无法到达终点了
                    break;
                }
                q.push(a[i].b);
            }
        }
        if(p>=l){//能到达的话
            cout<<ans<<endl;
        }else{//不能到达
            cout<<-1<<endl;
        }
    }
    return 0;
}

おすすめ

転載: blog.csdn.net/weixin_44178736/article/details/94722319