[] Poj2431駆動問題 - 貪欲、プライオリティキュー

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

説明

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

トラックを修復するには、牛が長く、曲がりくねった道ダウン最寄りの町(遠くを超えない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個の以上の単位を取得するドライブ4つの以上のユニットを、燃料の5つの以上の単位を取得することを停止し、町に駆動することを停止します。

ソース

アイデア:
  大きなルートヒープを投げることができるようにガソリンスタンドに行く保ち、ガソリンスタンドのうちで最も油が給油するたびに、最後まで、数を記録します。
コード:
#include<cstdio>
#include<cstdlib>
#include<iostream>
#include<queue>
#include<algorithm>
#define int long long
#define N 100050
using namespace std;
int n,L,p,sum,ans,cnt;
struct node
{
	int dis,l;
	bool operator < (const node &a) const
	{
		return dis > a.dis;
	}
}e[N];
priority_queue <int> q;
signed main()
{
	scanf("%lld",&n);
	for(int i=0,a,b;i<n;i++)
	{
		scanf("%lld%lld",&e[i].dis,&e[i].l);
	}
	scanf("%lld%lld",&L,&p);
	int tmp=0;
	q.push(p);
	sort(e,e+n);
	while(L>0&&!q.empty())
	{
		L-=q.top();
		ans++;
		q.pop();
		while(L<=e[tmp].dis&&tmp<n)
		q.push(e[tmp++].l);
	}
	if(L>0) printf("-1\n");
	else printf("%d\n",ans-1);
	return 0;
}

 

おすすめ

転載: www.cnblogs.com/yelir/p/11570260.html
おすすめ