正文

旅行家的预算(acm)2007-06-08 08:17:00

【评论】 【打印】 【字体: 】 本文链接:http://blog.pfan.cn/lingdlz/26498.html

分享到:

旅行家的预算 
Problem description
一个旅行家想驾驶汽车以最少的费用从一个城市到另一个城市(假设出发时油箱是空的)。给定两个城市

之间的距离D1、汽车油箱的容量C(以升为单位).每升汽油能行驶的距离D2、出发点每升汽油价格P和沿

途油站数N(N可以为零),油站i离出发点的距Di、每升汽油价格 Pi( i=l,2,...N)。计算结果四舍

五入至小数点后两位。如果无法到达目的地,则输出“No solution”。

 
Input
输入数据的第一行是四个实数;
D1 C D2 P分别表示两个城市之间的距离,汽车油箱的容量,每升汽油能行驶的距离,出发点每升汽油价

格;
第二行是一个整数N,沿途的油站数。
第三行到第N+2,每一行是一个油站的基本信息描述,包括该油站离出发点的距离,该油站每升汽油的价

格。

 
Output
输出到达目的城市的最小费用(四舍五入到两位小数),若不能到达目的城市则输出 No solution

 
Sample Input
275.6  11.9   27.4  2.8
2
102.0  2.9
220.0   2.2
 
Sample Output
26.95
 
Problem Source
NOI

// 测试用例
275.6  11.9   17.4  2.8
2
102.0  2.9
220.0   2.21
42.54

275.6  11.9   10.4  2.8
3
102.0  2.1
160.2  2.3
220.0  2.2
62.99
 
// mycode 2007--6--8

#include <stdio.h>
#include <float.h>

typedef struct node{
 float d;
 float j;
 float dist;
}NODE;

int    main(){
 float money,maxoil,totald,speed,price;
 float tpdist,minj,tdist,maxdist;
 int   m,i,j,k;
 NODE  pnode[100];
 
 scanf("%f %f %f %f",&totald,&maxoil,&speed,&price);
 scanf("%d",&m);
 for(i = 1; i <= m; i++)
  scanf("%f %f",&pnode[i].d,&pnode[i].j);
 pnode[m+1].j =  pnode[0].d = 0.0;
 pnode[0].j = price;
 pnode[m+1].d = totald;
 maxdist = maxoil * speed;
 for(i = 0; i <= m; i++){
  pnode[i].d = pnode[i+1].d - pnode[i].d;
  pnode[i].dist = 0.0;
  if(pnode[i].d > maxdist){
   printf("No solution\n");
   return 0;
  }
 }
 for(pnode[0].dist=pnode[0].d,i=1; i <= m; i++){
  for(j=i-1,tdist = 0.0; tdist < maxdist && j >= 0; j--)
   tdist += pnode[j].d;
  for(k=j+1,tpdist=pnode[i].d; tpdist > 0.0;){   
   for(j=k,minj=pnode[j].j; j <= i; j++){
    if(minj > pnode[j].j){
     k = j;
     minj = pnode[j].j;
    }
   }
   if(k == i){
    pnode[i].dist += tpdist;
    break;
   }
   for(j=k,tdist=0.0; j < i; j++)
    tdist += pnode[j].dist;
   if(maxdist-tdist > tpdist)
    pnode[k].dist += tpdist;
   else
    pnode[k].dist += (maxdist-tdist);
   tpdist = tpdist + tdist - maxdist;
   k++;
  }
 }
 for(money=0.0,i=0; i <= m; i++)
  money = money + pnode[i].dist / speed * pnode[i].j;
 printf("%.2f\n",money);
 return 0;
}

阅读(6685) | 评论(1)


版权声明:编程爱好者网站为此博客服务提供商,如本文牵涉到版权问题,编程爱好者网站不承担相关责任,如有版权问题请直接与本文作者联系解决。谢谢!

评论

loading...
您需要登录后才能评论,请 登录 或者 注册