汽车加油行驶问题
2012-03-28 11:20
330 查看
http://poj.org/problem?id=2431 Expedition
http://poj.org/problem?id=2465 Adventures in Moving - Part IV
http://pat.zju.edu.cn/contests/pat-practise/1033
To Fill or Not to Fill
/* n个加油站,,邮箱容量不限,,,,每个加油站可加的油量有限,,,求最少的加油次数 因为邮箱容量不限,,,可以这样贪心,,,如果邮箱的油能到达下一站,,则直接到达下一站,,否则,,,从已经走过的加油站中选择油量最多的站加一次油 */ #include<iostream> #include<algorithm> #include<queue> #include<cstdio> using namespace std; struct Node { int distance,fuel; //定义一个优先队列 friend bool operator<(Node a, Node b) { //从小到大排序采用“>”号;如果要从大到小排序,则采用“<”号 return a.fuel < b.fuel; //从大到小排序 } }node[10001]; bool cmp(const Node &a,const Node &b) { return a.distance < b.distance; } void Solve(int n,int L,int P) { int i=0,j=P,ans=0; priority_queue<Node>q; //用优先队列来维护一个按照加油站油量从大到小来排序 Node temp; while(node[i].distance<0) i++; while(i < n && j < L) { while(i < n && node[i].distance <= j) //有油的时候能走多远就走多远 { q.push(node[i]); ++i; } if(q.empty()) break; temp = q.top(); q.pop(); j += temp.fuel; //如果走不到,就必须要加一次油,途中会遇到很多加油站,一定要选择油最多的那个加油站 ans++; } if(j < L) printf("-1\n"); else printf("%d\n",ans); } int main(void) { int i,n,L,P; while (scanf("%d",&n)!=EOF) { sort(node,node+n,cmp); for (i = 0; i < n; ++i) scanf("%d %d",&node[i].distance,&node[i].fuel); scanf("%d %d",&L,&P); for (i = 0; i < n; ++i) node[i].distance = L - node[i].distance; //当前位置跟加油站之间的距离 sort(node,node+n,cmp); Solve(n,L,P); } return 0; }
http://poj.org/problem?id=2465 Adventures in Moving - Part IV
/* 题意:有一辆车要从起点0,到终点L处,中间有若干个加油站,给出车的油箱容量200,每行驶1km耗油1L。给出加油站的坐标,以及每个加油站的油价。一开始油箱里有100L的油,到达终点时必须还有100L的油,求最少花多少钱在加油上 分析:DP。F[i,j]表示到达第i个加油站有油j升的最优值,到达一个加油站时,枚举加多少油就好了 */ //汽车油箱为200,初始油箱内只有100,当到达目的地时,油箱内的油>=100 #include<iostream> #include<cstdio> using namespace std; #include<memory.h> #define INF 1061109567 inline int min(int a,int b) { if(a<b) return a; else return b; } int dist[103],price[103]; int dp[103][203]; //dp[i][j]表示到达地i个加油站,还剩下j油量的最少代价 int main(void) { int i,j,k,n,len,d,p,m,ans; scanf("%d",&len); n=0; while(scanf("%d %d",&d,&p) != EOF) { dist = d; price[n++] = p; } dist = len; price[n++] = INF; memset(dp,0x3f3f3f,sizeof(dp)); dp[0][100-dist[0]] = 0; for(i = 0 ; i < n - 1 ; ++i) { for(j = 0 ; j <= 200 ; ++j) { if(dp[i][j] == INF) continue; for(k = 0 ; k+j <= 200 ; ++k) { m = k + j - (dist[i+1] - dist[i]); if(m < 0 ) continue; dp[i+1][m] = min(dp[i+1][m],dp[i][j] + k*price[i] ); } } } ans = INF; for(i = 100 ; i <= 200 ; ++i) { if(dp[n-1][i] < ans) ans = dp[n-1][i]; } if(ans == INF) puts("Impossible"); else printf("%d\n",ans); return 0; }
http://pat.zju.edu.cn/contests/pat-practise/1033
To Fill or Not to Fill
#include<iostream> #include<algorithm> #include<cstdio> using namespace std; struct Node { double price; double length; }node[502]; bool cmp(const Node &a,const Node &b) { return a.length<b.length; } double capacity , dist ; int unit_gas ,n; int main(void) { int i,j,m,index; double sum,len,cur_capacity,min_price; bool flag; while (scanf("%lf %lf %d %d",&capacity,&dist,&unit_gas,&n)!=EOF) { len = capacity*unit_gas; for (i = 0; i < n; ++i) scanf("%lf %lf",&node[i].price,&node[i].length); sort(node,node+n,cmp); node .price = 0; node .length = dist; if(node[0].length>0) { printf("The maximum travel distance = 0.00\n"); continue; } else { flag = false; cur_capacity = 0; sum = 0; for( i = 0 ; i < n ;) { if(node[i+1].length - node[i].length > len) //某两个油站之间的距离大于汽车油箱装满油量的最大行程 { flag = true; printf("The maximum travel distance = %.2lf\n",node[i].length + len); break; } else { index = i; min_price = node[i].price; //找出当前油箱里的油能到达的所有加油站里,油价最便宜的那个 for(j = i + 1 ; node[j].length - node[i].length <= cur_capacity*unit_gas && j <= n ; j++) { if(node[j].price < min_price) { min_price = node[j].price; index = j; } } if(index != i) { cur_capacity -= (node[index].length - node[i].length)/unit_gas; i = index; continue; } //若找不到,找出最近的一个能到达的比当前油价便宜的站,加一些油,跑到那个站 index = i; for(j = i + 1 ; node[j].length - node[i].length <= len && j <= n ; j++) { if(node[j].price < node[i].price) { index = j; break; } } if(index != i) { sum += ((node[index].length - node[i].length)/unit_gas - cur_capacity)*node[i].price; cur_capacity = 0; i = index; continue; } //找不到比当前油站的价格还便宜的油站的时候 //在当前油站需要加满油,跑到能跑到的所有站里油价最小的那个油站 index = i; min_price = 1e18; for(j = i + 1 ; node[j].length - node[i].length <= len && j <= n ; j++) { if(node[j].price < min_price) { min_price = node[j].price; index = j; } } sum += (capacity-cur_capacity)*node[i].price; cur_capacity = capacity - (node[index].length - node[i].length )/unit_gas; i = index; }//else }//for }//else if(!flag) printf("%.2lf\n",sum); } return 0; }
相关文章推荐
- 汽车加油行驶问题(分层图最短路)
- light oj 1254 - Prison Break (Dijkstra 汽车加油行驶最优问题 最短路)
- 【网络流24题】汽车加油行驶问题(最短路)
- 【dp】汽车加油行驶问题
- 【网络流24题15】汽车加油行驶问题
- [CODEVS1912] 汽车加油行驶问题(分层图最短路)
- 网络流24题 之十五 汽车加油行驶问题 分层图
- 【网络流24题】 No.15 汽车加油行驶问题 (分层图最短路i)
- 汽车行驶加油问题
- 【线性规划与网络流24题】汽车加油行驶问题 分层图
- 汽车加油行驶问题
- 洛谷P4009:汽车加油行驶问题
- [网络流24题] 汽车加油行驶问题
- 洛谷P4009 汽车加油行驶问题(分层最短路)
- 【线性规划与网络流24题】汽车加油行驶问题 分层图
- 洛谷P4009汽车加油行驶问题
- [codevs 1912] 汽车加油行驶问题
- 汽车加油行驶问题
- 汽车加油行驶问题专题
- [codevs 1912] 汽车加油行驶问题