Expedition
Time Limit: 1000MS | Memory Limit: 65536K | |
Total Submissions: 13234 | Accepted: 3755 |
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.
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
* 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.
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.
大致意思说的是我也分不清楚的牛或人开着漏油的车,前往距离为 L 的地方,初始的油量为 P ,车的油箱破损坏,每行走一个单位的距离就会减少一个单位的油量,途中会路过多个可以加油站,每个加油站都可以加一定数量的油,问,最少停靠几次加油站可以到达终点,不能就输出-1
输入
第一行整数 N 表示有 N 个加油站
接下来的 N 行有两个整数分别表示 该站到达小镇的距离和可获得的油量
最后一行输入距离 L 和初始油量 P
输出
最少需要加油的次数,无法到达输出-1
**注意
1,给出的数据是无序的,
2,距离表示的是到达终点的距离,而不是距离起点的距离
思路
变换思考方式,采用优先队列的方法,当燃料为0的时候,选择当前队列里面的最大值作为加油量,这样就可以保证接下来可以走更远的路程了,为了方便起见,我们吧终点也看做为一个加油站
#include <iostream>
#include <algorithm>
#include <queue>
using namespace std;
struct station{
int a,b;//a表示距离 b表示油量
};
station sta[10001];
int N,L,P;
int solve()
{
priority_queue<int> que;//优先队列 标准库函数
int ans = 0,pos = 0,tank = P;
for(int i=0;i<N;i++)
{
int d = sta[i].a - pos;
while(tank-d<0)
{
if(que.empty())
return -1;
tank += que.top();
que.pop();
ans++;
}
tank -= d;
pos = sta[i].a;
que.push(sta[i].b);
}
return ans;
}
int compare(station x,station y)
{
return x.a<y.a;
}
int main()
{
while(cin>>N)
{
for(int i=0;i<N;i++)
{
cin>>sta[i].a>>sta[i].b;
}
cin>>L>>P;
for(int i=0;i<N;i++)//转化距离
sta[i].a = L - sta[i].a;
sort(sta,sta+N,compare);
sta[N].a = L,sta[N].b = 0,++N;//把终点看成是一个站
int res = solve();
cout<<res<<endl;
}
return 0;
}
奈何我冒泡的算法如何打动你超时的心!!!