[queue] 奶牛喝汽油(學生起的名字) SP348 EXPEDI

SP348 EXPEDI - Expedition

https://www.luogu.org/problemnew/show/SP348

http://poj.org/problem?id=2431

題意翻譯

Xavier養的一羣奶牛劫持了一個卡車,並向叢林中逃亡。由於奶牛們不會開車,卡車不幸地撞上了叢林中的一塊岩石,並撞破了油箱。於是他們每行駛一個單位距離,油箱就漏一單位油。 爲了修理這個卡車,奶牛們需要沿着一條長長的公路行駛到最近的一個城鎮。在這條路上,在卡車當前位置和城鎮之間,有N個加油站,每個加油站有不多於100單位的汽油。 叢林對於人類來說是個危險的地方,更不用說奶牛了。因此,奶牛們想要他們停下加油的次數儘量少。幸運的是,卡車的油箱是如此的大,可以容納任意多的汽油。卡車現在距離城鎮L單位長度,油箱裏有P單位的油。 請求出奶牛們最少的加油次數,或者他們根本無法到達城鎮,無解請輸出-1 題目有多組數據 每組第一行有一個整數N(N <= 10 , 000) 下面N行,每行兩個整數,分別代表每個加油站與城鎮的距離和本加油站擁有的汽油量。 每組最後一行有兩個整數,LP(1 <= P <= 1 , 000 , 000) 如果奶牛們能到達城鎮,輸出一個整數,代表最少加油的次數。否則輸出-1

題目描述

A group of cows grabbed a truck and ventured on an expedition deep into the jungle. Being rather poor drivers, the cows unfortunately managed to run over a rock and puncture the truck's fuel tank. The truck now leaks one unit of fuel every unit of distance it travels.

To repair the truck, the cows need to drive to the nearest town (no more than 1,000,000 units distant) down a long, winding road. On this road, between the town and the current location of the truck, there are N (1 <= N <= 10,000) fuel stops where the cows can stop to acquire additional fuel (1..100 units at each stop).

The jungle is a dangerous place for humans and is especially dangerous for cows. Therefore, the cows want to make the minimum possible number of stops for fuel on the way to the town. Fortunately, the capacity of the fuel tank on their truck is so large that there is effectively no limit to the amount of fuel it can hold. The truck is currently L units away from the town and has P units of fuel (1 <= P <= 1,000,000).

Determine the minimum number of stops needed to reach the town, or if the cows cannot reach the town at all.

輸入輸出格式

輸入格式:
 

The first line of the input contains an integer t representing the number of test cases. Then t test cases follow. Each test case has the follwing form:

  • Line 1: A single integer, N
  • Lines 2..N+1: Each line contains two space-separated integers describing a fuel stop: The first integer is the distance from the town to the stop; the second is the amount of fuel available at that stop.
  • Line N+2: Two space-separated integers, L and P

輸出格式:

For each test case, output a single integer giving the minimum number of fuel stops necessary to reach the town. If it is not possible to reach the town, output -1.

輸入輸出樣例

             1          2            3              4    

P(10)   4(4)     5(2)      11(5)     15(10)      25 

輸入樣例#1 複製

1   共幾組測試數據

4    N

4 4   第一個是距出發點的距離  第二個是可加油量

5 2

11 5

15 10

25 10   L最遠距離   P剛開始有的油

輸出樣例#1 複製

2

 

Input details

The truck is 25 units away from the town; the truck has 10 units

of fuel.  Along the road, there are 4 fuel stops at distances 4,

5, 11, and 15 from the town (so these are initially at distances

21, 20, 14, and 10 from the truck).  These fuel stops can supply

up to 4, 2, 5, and 10 units of fuel, respectively.

 

Output details:

Drive 10 units, stop to acquire 10 more units of fuel, drive 4 more

units, stop to acquire 5 more units of fuel, then drive to the town.

#include<iostream>
#include<queue>
#include<cstdio>
#include<algorithm>
using namespace std;
#define MAX_N 10000
int group,N,L,P;
struct node{
	int A,B;
}p[MAX_N+5];
bool cmp(node i,node j){
	return i.A<j.A;
}
void print(int a){//測試用 ,不用看 
	int ans=0;
	for(int i=0;i<a;i++){
		cout<<i<<"---"<<p[i].A<<" "<<p[i].B<<"---"<<8965-p[i].A<<endl;
		ans+=p[i].B;
	}
}
int main() {
	freopen("exp.12.in","r",stdin);
	priority_queue<int> pque;
//處理讀入的數據 
	cin>>N;
	for(int i=1; i<=N; i++) {
		scanf("%d %d",&p[i].A,&p[i].B);
	}
	cin>>L>>P;
	for(int i=1; i<=N; i++) {
		p[i].A=L-p[i].A;
	}
	sort(p+1,p+N+1,cmp);
//走一站,帶走一站的油,發現油箱是負的,停下開始喝油 ,直到油箱不爲0 
	p[N+1].A=L;	p[N+1].B=0;	//相當於是加一個油量是0的站
    p[0].A=0;p[N+1].B=0;
	long long trank=P; int ans=0;
	for(int i=1;i<=N+1;i++){
		trank=trank-(p[i].A-p[i-1].A);
		while(trank<0&&!pque.empty()){
			trank+=pque.top();
			pque.pop();
			ans++;
		}
		if(trank<0){
			cout<<-1<<endl; return 0;
		}
		pque.push(p[i].B);
	}
	cout<<ans<<endl;
	return 0;
}
//能不能最小堆 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章