Poj 2431 Expedition【优先队列+贪心】

来源:互联网 发布:分水岭算法 过分割 编辑:程序博客网 时间:2024/05/20 01:37

Expedition

Time Limit: 1000MS

 

Memory Limit: 65536K

Total Submissions: 13094

 

Accepted: 3723

Description

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. 

Input

* 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

Output

* Line 1: 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.

Sample Input

4

4 4

5 2

11 5

15 10

25 10

Sample Output

2

Hint

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.

Source

USACO 2005 U S Open Gold

 

题目大意:

一共有n个加油站,每个油站有加油的上限,我们从L点出发,要行进到0点,每行进一个单位长度,就要花费一个单位油量,初始油量为p,设定油量没有上限的情况下,求最少要在多少个油站进行加油。


思路:


1、首先考虑到长度不超过1000000,那么我们设定一个数组pos【i】=x,表示在位子i可以加的油量为x。


2、然后我们需要从L点出发,我们模拟一个过程,从起点出发,每行进一个单位就花费1单位油量,途径的油站能够加的油的数量,我们存在最大值优先队列当中。我们先不添加油量,因为我们现在并不知道是否需要添加这份油量,而且不知道后边有没有油站加的油比当前油站更多,所以我们将p>=0时候途径的油站的油量都存在优先队列中,当p==0的时候,我们就将优先队列的队头取出,表示我们要在途径这个过程中的那个油站添加油量,此时output++,p增大,然后继续向前行进,依次类推。


3、当p==0,并且最大值优先队列为空的时候,就已经说明我们跑不到终点了,此时需要输出-1.


Ac代码:

#include<stdio.h>#include<string.h>#include<queue>using namespace std;int pos[1000500];int main(){    int n;    scanf("%d",&n);    priority_queue<int >s;    memset(pos,0,sizeof(pos));    for(int i=0;i<n;i++)    {        int x,y;        scanf("%d%d",&x,&y);        pos[x]+=y;    }    int l,p;    scanf("%d%d",&l,&p);    int output=0;    int flag=0;    for(int i=l;i>=0;i--)    {        if(i==0)        {            if(p<0)            {                flag=1;break;            }            else break;        }        if(pos[i]>0)        {            s.push(pos[i]);            pos[i]=0;        }        if(p==0)        {            if(s.size()==0)            {                flag=1;                break;            }            else            {                p+=s.top();                s.pop();                output++;            }        }        p--;    }    if(flag==1)printf("-1\n");    else    printf("%d\n",output);}



0 0
原创粉丝点击