您的位置:首页 > 其它

POJ 2431 Expedition

2015-06-04 21:04 337 查看
贪心策略:如果当前车子剩的油量可以撑到下一个加油站,就不加油走到下一个加油站,如果剩余的油不够,就从经过的加油站里面优先选能够加的油最多的加油站加油,加油后把对应的加油站踢出优先队列,经过的加油站加入优先队列,如果不出现所有能用的加油站全部加油还到不了下一个车站的情况,那么车就可以一直开到终点,且加油次数一定是最少的,反之,如果车子连下个一加油站都没发到,肯定也到不了终点。

#include <stdio.h>
#include <algorithm>
#include <queue>
using namespace std;

typedef struct station{
int pos;
int fuel;
}station;

station arr[10005];

int cmp(const void *a, const void *b){
station *sta_a = (station*)a;
station *sta_b = (station*)b;

return sta_a->pos - sta_b->pos;
}

void solve(int L, int P, int N){
int i, cur_fuel, dis, cnt;
priority_queue<int> pq; //用于得出当前经过的能够加最多油的加油站能够加多少油

for(i=0; i<N; i++)
arr[i].pos = L-arr[i].pos;
qsort(arr, N, sizeof(station), cmp);

//把终点也当成一个加油站
arr
.pos = L;
arr
.fuel = 0;

cur_fuel = P;
cnt = 0;
for(i=0; i<=N; i++){
if(0 == i)
dis = arr[0].pos;
else
dis = arr[i].pos - arr[i-1].pos;

if(cur_fuel >= dis){
//剩余的油还可以撑到i号加油站
cur_fuel -= dis;
pq.push(arr[i].fuel);
}
else{
/*
剩余的油不够到下一个加油站,就从已经经过的加油站里面选出加油站进行加油
直到油量足够到达下一个加油站为止
*/

while(!pq.empty()){
if(cur_fuel >= dis)
break;
cur_fuel += pq.top();
pq.pop();
cnt++;
}

if(cur_fuel < dis){
//怎么加油也到不了下一站,说明到不了终点
cnt = -1;
break;
}
else{
cur_fuel -= dis;
pq.push(arr[i].fuel);
}
}
}
printf("%d\n", cnt);
}

int main(void){
int N, i, L, P;

//freopen("input.dat", "r", stdin);
while(EOF != scanf("%d", &N)){
for(i=0; i<N; i++)
scanf("%d %d", &(arr[i].pos), &(arr[i].fuel));
scanf("%d %d", &L, &P);
solve(L, P, N);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  acm poj