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行,两个数字,油站i离出发点的距离Di和每升汽油价格Pi。

输出格式:

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

输入输出样例

输入样例#1:

275.6 11.9 27.4 2.8 2
102.0 2.9
220.0 2.2

输出样例#1:

26.95

分析:在能到达的加油站中内寻找最便宜的加油站,然后判断是否能一次到达,不能的话先加满,然后一个一个判断直到剩下的油量不足到下一个加油站就加油,不用加满。

  remain是当前剩余的油,cost花费,pos目标站

所有有两种情况:
1.当前站就是pos 再细分两种情况:
   1.从pos就可以走到终点,于是我们把油加到刚好到达终点即可
     cost += ((d[i] - d[pos]) / d2 - remain)*p[pos];就得到了最后答案。
    2.从pos不能一把走到终点于是,从当前位置走,走到哪里加油都不如在pos这里加油划算。所以加满。
2.当前站点是在pos后面的某个站点,也有两种情况
    1.当前剩余的油remain不够走到此站,所以我们把油加来刚好能够走到此站就行了。(因为这里便宜!)
    2.剩余的油remain足够,直接开过去就行了。
 1 #include<cstdio>
 2 int n;
 3 double d1,d2,c;
 4 double remain=0,cost=0;
 5 double p[1010],d[1010];
 6 int main()
 7 {
 8     scanf("%lf%lf%lf%lf%d",&d1,&c,&d2,&p[0],&n);
 9     for(int i=1;i<=n;++i)
10     {
11         scanf("%lf%lf",&d[i],&p[i]);
12     }
13     d[n+1] = d1;
14     int pos = 0;
15     do{
16         bool flag = false;    //判断能不能到达
17         for (int i=pos+1;i<=n+1&&d[i]<=d[pos]+c*d2;i++) //判断加满油能不能到达下一个加油站
18         {
19             if(p[i]<p[pos])   //找更便宜的加油站
20             {
21                 if(d[pos]+remain*d2>=d[i])    //如果剩余的油足够,就开过去
22                 {
23                     remain -= (d[i]-d[pos])/d2;//油量将减少从一个站点到下一个站点用到的油
24                 }
25                 else  //如果剩余的油不够
26                 {
27                     cost+=((d[i]-d[pos])/d2-remain)*p[pos];  //还需要加的油花费的价钱,不用加满
28                     remain = 0;    //到达下一个站点时没油了,所以剩余汽油量清0
29                 }
30                 pos = i;
31                 flag = true;
32                 break;
33             }
34         }
35         if(!flag)
36         {
37             cost += (c-remain)*p[pos];  //不能到达前花费了多少钱
38             remain = c-(d[pos+1]-d[pos])/d2;     //还剩多少油
39             if (remain>=0) pos++;  //小于0,油根本不够到达下一个站点,大于0,代表可以去下一个加油站
40             else
41             {
42                 printf("No Solution");
43                 return 0;
44             }
45         }
46     }
47     while(pos<=n);
48     printf("%.2lf",cost);
49     return 0;
50 }
时间: 2024-10-06 23:37:47

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

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

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

洛谷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