旅行家的预算  
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;
}

评论