汽车加油行驶问题
http://poj.org/problem?id=2431???Expedition
/* 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");elseprintf("%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 1061109567inline int min(int a,int b) {if(a<b)return a;elsereturn 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[n] = d;price[n++] = p;}dist[n] = 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");elseprintf("%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[n].price = 0;node[n].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}//elseif(!flag)printf("%.2lf\n",sum);}return 0; }總結
- 上一篇: 位压缩
- 下一篇: 2005年上海交通大学计算机研究生机试真