POJ 2431遠征貪欲プライオリティキュー

遠征
時間制限:  1000ミリ秒   メモリ制限:  65536kも
合計提出:  30702   受け入れ:  8457

説明

牛のグループは、トラックをつかんで、ジャングルに遠征深くに進出します。むしろ、貧しいドライバーなので、牛は残念ながら岩の上に実行して、トラックの燃料タンクを穿刺するために管理します。トラックは現在、燃料の一つのユニットが移動する距離のすべてのユニットをリーク。 

トラックを修復するには、牛が長く、曲がりくねった道を切ります(これ以上1,000,000以下のユニット遠い)最寄りの町にドライブする必要があります。牛は、追加の燃料(各停止時1..100単位)を取得するために停止することができる場合、この道路上、町及び台車の現在位置との間、N(1 <= N <= 10,000)燃料が停止されます。 

ジャングルは、人間にとって危険な場所で、牛のために特に危険です。そのため、牛が町に向かう途中で燃料のための停止の可能な最小数を作りたいです。幸いなことに、彼らのトラック上の燃料タンクの容量を有効にそれが保持できる燃料の量に制限がないことを非常に大きいです。トラックは、現在離れて町からL単位であり、燃料のPユニット(1 <= P <= 1,000,000)を有しています。 

町に到達するために必要な停止の最小数を決定し、または牛はすべての町に到達できない場合。 

入力

* 1行目:単一の整数、N 

*ライン2..N + 1:各行は燃料絞りを記述する2スペースで区切られた整数を含む:最初の整数は、停止まで町からの距離です。第二は、その停止時利用可能な燃料の量です。 

*ラインN + 2:二つのスペースで区切られた整数、LおよびP

出力

* 1行目:燃料の最小数を与える単一の整数は町に到達するために必要な停止します。それは町に到達することができない場合、出力-1。

サンプル入力

4 
4 4 
5 2 
11 5 
15 10 
25 10

サンプル出力

2

ヒント

INPUT詳細: 

トラックが25個の単位離れた町からです。トラックは、燃料の10個の単位を有します。道路に沿って、4燃料がある(これらは、トラックからの距離21、20、14、及び10で最初にあるので)町からの距離4、5、11、及び15で停止します。これらの燃料停止は、それぞれ、燃料の最大4、2、5、及び10単位を供給することができます。 

OUTPUTの詳細: 

ドライブ10単位、取得する停止燃料の10の以上のユニットは、町に車、燃料の取得5以上のユニットに4単位以上、絞りを駆動します。

ソース

 
1の#include <cstdioを>
 2の#include <iostreamの>
 3の#include <キュー>
 4の#include <アルゴリズム>
 5  
6  使用して 名前空間STDを、
7  
8  CONST  INT max_n = 1E4 + 2 9  CONST  INT max_L = 1E6。
10  CONST  INT max_P = 1E6。
11  CONST  INT MAX_A = max_L。
12  CONST  INT MAX_B = 100 13  
14  INT N、L、P。
15 int型A [max_n]、B [max_n];
 16  
。17のtypedef ストラクトノード
 18である {
 図19      のint B、A;
 20  };
 21は、 ノードノード[max_n];
 22である 
23は 
24  BOOL CMP(ノードA、ノードB)
 25  {
 26が     リターン AA < BA;
 27  }
 28  
29  ボイド(解決)
 30  {
 31である     // 便宜上端局として、理解される
32      ノード[N-】II.A = L;
 33である      ノード[N-] = .B 0 ;
 34れる      ++N-;
 35  
36      // 配列は、距離によって並べ替え
 37      @ 私はソートする必要はありません、狂気WAことを、私白書害
38がある      (ノード、ノード+ソート; N-、CMP)
 39  
40  //     (int型I = 0; I <N-; I ++)
 41である 。//     {
 42である //         COUT <<ノード[I]はII.A << '' <<ノード[I]は.B << ENDL;
 43である //     } 
44である 
45      INT ANS = 0 46である 
47      // オイルが最大のプライオリティキューが保管場所に到達することができ定義
48を      PRIORITY_QUEUE < INT > ヒープ;
 49  
50      のためにINT I =0 ; I <N-; ++ I)
 51は     、{
 52である         // ループの外端に現在まで、
53である         IF(P> = L)
 54である         {
 55              BREAK ;
 56である         }
 57である         // 現在到達点
58          ながら <(P ノード[I] II.A)
 59          {
 60              //は給油、またはまで空
61は、             IF (heap.empty())
 62である             {
 63は                  プット(" -1 " );
 64                  リターン;
 65              }
 66             ++ ANS;
 67              P = + heap.top();
 68              heap.pop();
 69          }
 70  
71であり、         // 現在のポイントにこの時点までは、スタックに追加されて
72          heap.push([I] .Bノード);
 73のIS      }
 74  
75      のprintf(" %D \ N- " 、ANS);
 76  }
 77  
78  のint main()の
 79  {
 80      scanfの(" %のD "、およびN-);
 81      INT DIS、燃料;
 82      INTiは= 0、I <N; ++ I)
 83      {
 84          のscanf(" %D%D "、&​​DIS、および燃料)
85          ノード[i]は.A = DIS。
86          ノード[i]は.B = 燃料。
87      }
 88  
89      のscanf(" %D%D "、&​​L、&P)。
90  
91      のためにINT iは= 0 ; iは<N; ++ I)
 92      {
 93          ノード[i]は.A = L- ノード[i]は.A。
94      }
 95      )(解きます。
96      リターン 0 97 }

 

 

おすすめ

転載: www.cnblogs.com/jishuren/p/12264510.html