p1016旅行家的预算

  

题目描述

一个旅行家想驾驶汽车以最少的费用从一个城市到另一个城市(假设出发时油箱是空的)。给定两个城市之间的距离 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 }

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

时间: 2024-10-06 01:59:52

p1016旅行家的预算的相关文章

P1016 旅行家的预算

P1016 旅行家的预算 题目描述 一个旅行家想驾驶汽车以最少的费用从一个城市到另一个城市(假设出发时油箱是空的).给定两个城市之间的距离D1.汽车油箱的容量C(以升为单位).每升汽油能行驶的距离D2.出发点每升汽油价格P和沿途油站数N(N可以为零),油站i离出发点的距离Di.每升汽油价格Pi(i=1,2,…,N).计算结果四舍五入至小数点后两位.如果无法到达目的地,则输出“No Solution”. 输入输出格式 输入格式: 第一行,D1,C,D2,P,N. 接下来有N行. 第i+1行,两个数

[NOIP1999] 提高组 洛谷P1016 旅行家的预算

题目描述 一个旅行家想驾驶汽车以最少的费用从一个城市到另一个城市(假设出发时油箱是空的).给定两个城市之间的距离D1.汽车油箱的容量C(以升为单位).每升汽油能行驶的距离D2.出发点每升汽油价格P和沿途油站数N(N可以为零),油站i离出发点的距离Di.每升汽油价格Pi(i=1,2,…,N).计算结果四舍五入至小数点后两位.如果无法到达目的地,则输出“No Solution”. 输入输出格式 输入格式: 第一行,D1,C,D2,P,N. 接下来有N行. 第i+1行,两个数字,油站i离出发点的距离D

洛谷P1016 旅行家的预算 贪心

这道题就是贪心 1.在第一个加油站的时候,如果在加满油能够到达的加油站中有一个加油站的钱比自己的少(其实等于也行),那就 加足够到那个车站的油,直接去那个车站2.这些车站中所有都比自己大,那就找一个其中钱最少的车站 在当前车站加满油,然后直接开到那个车站 3.然后到达车站时就不断重复以上的处理方法4.但这样有一个问题就是你无法到达最后一个车站,于是我们把最后一个车站的费用变为0(其实还是-1更保险)这样就保证如果能到,就一定能走到最后一个车站5.那么如何判断能否到达呢?如果在一次加油站处理操作时

蓝桥杯 算法训练 ALGO-15 旅行家的预算

算法训练 旅行家的预算 时间限制:1.0s   内存限制:256.0MB 问题描述 一个旅行家想驾驶汽车以最少的费用从一个城市到另一个城市(假设出发时油箱是空的).给定两个城市之间的距离D1.汽车油箱的容量C(以升为单位).每升汽油能行驶的距离D2.出发点每升汽油价格P和沿途油站数N(N可以为零),油站i离出发点的距离Di.每升汽油价格Pi(i=1,2,--N).计算结果四舍五入至小数点后两位.如果无法到达目的地,则输出"No Solution". 输入格式 第一行为4个实数D1.C.

分治:旅行家的预算(travel)

旅行家的预算(Travel) [问题描述]      一个旅行家想驾驶汽车以最少的费用从一个城市到另一个城市(假设出发时油箱是空的).给定两个城市之间的距离D1.汽车油箱的容量C(以升为单位).每升汽油能行驶的距离D2.出发点每升汽油价格P和沿途油站数N(N可以为零),油站i离出发点的距离Di.每升汽油价格  Pi( i=l,2,...N).计算结果四舍五入至小数点后两位.如果无法到达目的地,则输出“No Solution”. [输入数据] 第一行:D1  C  D2  P  N,其含义与题目描

【P1016】旅行家的预算

题目描述 一个旅行家想驾驶汽车以最少的费用从一个城市到另一个城市(假设出发时油箱是空的).给定两个城市之间的距离D1.汽车油箱的容量C(以升为单位).每升汽油能行驶的距离D2.出发点每升汽油价格P和沿途油站数N(N可以为零),油站i离出发点的距离Di.每升汽油价格Pi(i=1,2,…,N).计算结果四舍五入至小数点后两位.如果无法到达目的地,则输出“No Solution”. 输入输出格式 Input/output 输入格式:第一行,D1,C,D2,P,N.接下来有N行.第i+1行,两个数字,油

旅行家的预算 1999年NOIP全国联赛普及组NOIP全国联赛提高组

时间限制: 1 s 空间限制: 128000 KB 题目描述 Description 一个旅行家想驾驶汽车以最少的费用从一个城市到另一个城市(假设出发时油箱是空的).给定两个城市之间的距离D1.汽车油箱的容量C(以升为单位).每升汽油能行驶的距离D2.出发点每升汽油价格P和沿途油站数N(N可以为零),油站i离出发点的距离Di.每升汽油价格Pi(i=1,2,--N).计算结果四舍五入至小数点后两位.如果无法到达目的地,则输出"No Solution". 输入描述 Input Descri

洛谷1016 旅行家的预算

题目描述 一个旅行家想驾驶汽车以最少的费用从一个城市到另一个城市(假设出发时油箱是空的).给定两个城市之间的距离D1.汽车油箱的容量C(以升为单位).每升汽油能行驶的距离D2.出发点每升汽油价格P和沿途油站数N(N可以为零),油站i离出发点的距离Di.每升汽油价格Pi(i=1,2,-,N).计算结果四舍五入至小数点后两位.如果无法到达目的地,则输出"No Solution". 输入输出格式 输入格式: 第一行,D1,C,D2,P,N. 接下来有N行. 第i+1行,两个数字,油站i离出发

NOIP1999 旅行家的预算

题目描述 一个旅行家想驾驶汽车以最少的费用从一个城市到另一个城市(假设出发时油箱是空的).给定两个城市之间的距离D1.汽车油箱的容量C(以升为单位).每升汽油能行驶的距离D2.出发点每升汽油价格P和沿途油站数N(N可以为零),油站i离出发点的距离Di.每升汽油价格Pi(i=1,2,…,N).计算结果四舍五入至小数点后两位.如果无法到达目的地,则输出“No Solution”. 输入输出格式 输入格式: 第一行,D1,C,D2,P,N. 接下来有N行. 第i+1行,两个数字,油站i离出发点的距离D