码迷,mamicode.com
首页 > 其他好文 > 详细

p1016旅行家的预算

时间:2018-08-07 01:40:48      阅读:183      评论:0      收藏:0      [点我收藏+]

标签:汽车   style   text   namespace   def   while   bsp   没有   bre   

  

题目描述

一个旅行家想驾驶汽车以最少的费用从一个城市到另一个城市(假设出发时油箱是空的)。给定两个城市之间的距离 D1D1 、汽车油箱的容量 CC (以升为单位)、每升汽油能行驶的距离 D2D2 、出发点每升汽油价格 PP 和沿途油站数 NN ( NN 可以为零),油站 ii 离出发点的距离 DiDi 、每升汽油价格 PiPi ( i=1,2,…,Ni=1,2,,N )。计算结果四舍五入至小数点后两位。如果无法到达目的地,则输出“No Solution”。

 

输入输出格式

输入格式:

 

第一行, D1D1 , CC , D2D2 , PP , NN 。

接下来有 NN 行。

第 i+1i+1 行,两个数字,油站i离出发点的距离 DiDi 和每升汽油价格 PiPi 。

 

输出格式:

 

所需最小费用,计算结果四舍五入至小数点后两位。如果无法到达目的地,则输出“No Solution”。

 

对于这个问题,首先我们想到贪心的思路。在能到达的加油站中有两种情况:1.选择最近的并且油价比当前的加油站a油价低的加油站b,加油到恰能到达b,然后依次做下一步打算。

2.在能到达的加油站中 没有比当前的油价更低,选择油价相比最低的加油站,加满油(注意是加满油)前往该加油站,再依次做下一步打算。

若加满油都不能到达其他加油站,则输出“No Solution!”。

 细节:

    终点看做·是第++n个加油站,并且油价设为-1(确保能到达目的地)。

  1 #include<cstdlib>
  2 #include<cstdio>
  3 #include<algorithm>
  4 #define debug
  5 using namespace std;
  6 int n;
  7 double d1,c,d2;
  8 struct oil
  9 {
 10      double d,p;
 11      bool operator <(const oil &th)const 
 12      {
 13          return d<th.d;
 14      } 
 15     
 16 }a[100];
 17 double  res_u;
 18 int main()
 19 {
 20     scanf("%lf%lf%lf%lf%d",&d1,&c,&d2,&a[0].p,&n);
 21     #ifdef debug 
 22     printf("%lf %lf %lf %lf\n" ,d1,c,d2,a[0].p,n);
 23     #endif 
 24     for(int i=1;i<=n;i++)
 25     {
 26         scanf("%lf%lf",&a[i].d,&a[i].p);
 27         #ifdef debug 
 28         printf("i=%d,%.2lf %.2lf\n",i,a[i].d,a[i].p);
 29         #endif
 30     }
 31     sort(a+1,a+1+n);
 32     #ifdef debug
 33     for(int i=1;i<=n;i++)
 34     printf("---%.2lf--- ",a[i].d);
 35     printf("\n");
 36     #endif  
 37     a[++n].d=d1;
 38     
 39     a[n].p=-1;
 40     int x=0;
 41     double sum=0.0;
 42     res_u=0;
 43     while(x<n)
 44     {
 45         bool can=false;
 46         bool cheap=false;
 47         double w=a[x].d+c*d2;
 48         int ans=10000000;
 49         int k;
 50         for(int i=x+1;(i<=n)&&(a[i].d<=w);i++)
 51         {
 52             can=true ;
 53             
 54             if(a[i].p<=a[x].p)
 55             {
 56                 cheap=true;
 57                 k=i;
 58                 break;
 59             }
 60             else
 61             {
 62                 if(a[i].p<=ans)
 63                 {
 64                     ans=a[i].p;
 65                     k=i;
 66                 }
 67             }
 68         }
 69         if(!can)
 70         {
 71             printf("No Solution");
 72             return 0;
 73         }
 74         
 75             if(cheap)
 76             {
 77              
 78              
 79                 double fe=(a[k].d-a[x].d)/d2;
 80                     sum+=(fe-res_u)*a[x].p;
 81                     res_u=0;
 82                     x=k;
 83                 
 84             }
 85         else
 86         {
 87             #ifdef debug
 88             printf("没找到便宜的:\n");
 89             #endif 
 90             sum+=(c-res_u)*a[x].p;
 91             res_u=c-(a[k].d-a[x].d)/d2;
 92             x=k;
 93             #ifdef debug 
 94             printf("sum=%lf\n-------\n",sum);
 95             #endif
 96             
 97         }
 98         
 99     }
100     printf("%.2lf",sum);
101  //  system("PAUSE");
102     return 0;
103 }

 

p1016旅行家的预算

标签:汽车   style   text   namespace   def   while   bsp   没有   bre   

原文地址:https://www.cnblogs.com/zxzmnh/p/9434299.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!