题目大意:
你有一辆卡车,从初始位置出发,油箱里目前有油量P,汽车每走1的距离就要耗费1点油量,沿途有加油站可以加油(前提是你车的油量能保证开过去);
要求输入:
第一行:N(表示沿途加油站的数量)
后N行:A B(输入两个数A、B,A是距离终点的位置!!!这算是一个坑点---是距离终点的位置,不是距离起始位置的距离,B是这个加油站能加的油量)
最后一行:L P(L路程总长度,P是初始油量)
我碰到的WA点:
1.一个是输入的问题
2.为了到达一个加油站可能在此之前多次加油(优先队列多次弹出)见数据2
3.没有设置终止条件(即如果车子到不了终点,应设置结束条件)
提供的易WA数据:
/*
<1>poj网站提供的
6
4 4
5 2
11 5
15 10
13 22
6 3
25 10
结果应为2
<2>
3
8 8
18 4
21 3
25 10
结果应为3
<3>
10
24 2
23 2
22 2
21 2
20 2
19 2
18 2
17 2
16 2
14 15
25 10
结果应为2
<4>
1
1 3
25 10
结果应为-1
*/
AC代码(优先队列+贪心):
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<queue>
using namespace std;
struct node {
int l;
int oil;
};
int N,L,P;
priority_queue<int>q;
node n[maxn];
bool cmp(node n1,node n2){
return n1.l<n2.l;
}
int main(){
cin>>N;
for(int i=0;i<N;i++){
cin>>n[i].l>>n[i].oil;
}
cin>>L>>P;
for(int i=0;i<N;i++){
n[i].l=L-n[i].l;
}
sort(n,n+N,cmp);
int pos=0;
int ans=0;
n[N].l=L;n[N].oil=0;
int i=0;
while(pos+P<L){
if(pos+P<n[i].l){
if(q.empty())break;//无法到达终点的终止条件
while(!q.empty()){ //沿途可能多次加油
int oil=q.top();
q.pop();
P+=oil;
ans++;
if(pos+P>=n[i].l){
q.push(n[i].oil);
P=P-(n[i].l-pos);
pos=n[i].l;
break;
}
}
}
else {
q.push(n[i].oil);
P=P-(n[i].l-pos);
pos=n[i].l;
}
i++;
}
if(pos+P>=L)cout<<ans<<endl;
else cout<<-1<<endl;
return 0;
}