• 83 旅行家的预算


    83 旅行家的预算

    作者: Turbo时间限制: 1S章节: 其它

    问题描述 :

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

    输入说明 :

      第一行为4个实数D1、C、D2、P与一个非负整数N;
      接下来N行,每行两个实数Di、Pi。

    输出说明 :

      如果可以到达目的地,输出一个实数(四舍五入至小数点后两位),表示最小费用;否则输出“No Solution”(不含引号)。

    输入范例 :
    275.6 11.9 27.4 2.8 2
    102.0 2.9
    220.0 2.2
    输出范例 :
    26.95

    #include <iostream>
    #include <cstdio>
    using namespace std;
    #define MAX 1001
    
    int main()
    {
    	int N;
    	double D1, C, D2, P;
    	cin >> D1 >> C >> D2 >> P;
    	cin >> N;          //总距离D1,总容量C,每升油可走距离 D2,初始油价 P, 加油站N个
    
    	double distance[MAX];                    //加油站i到起点的距离
    	double price[MAX];                          //油的价格
    
    	distance[0] = 0; price[0] = P;                      //加上起点的数据 距离为0 油价为P
    	distance[N + 1] = D1; price[N + 1] = 0;     //终点的数据 距离为D1 油价为0
    
    	double total = 0;                 //费用
    	double surplus = 0;             //到达第i个加油站剩余油量
    	double maxDis = C*D2;       //加满油行驶最大距离
    	bool flag = true;                 //是否能达到终点
    
    	for (int i = 1; i <= N; i++)
    	{
    		cin >> distance[i] >> price[i];
    		if (distance[i] - distance[i - 1] > maxDis)//如果有一段距离超过最大可行程,flag为假
    			flag = false;
    	}
    
    	if (flag == false)
    	{
    		cout << "No Solution" << endl;
    		return 0;
    	}
    
    	/* 
    	         i:当前加油站的编号
    			 j:下一个比自己便宜的加油站编号
    	*/
    	for (int i = 0, j; i <= N; i = j) //到达j后 将i=j 即当前加油站的编号   
    	{
    		for (j = i + 1; j <= N+1; j++)//从i的下一个加油站开始 找比当前加油站便宜的加油站 即price[j]<=prixe[i]
    		{
    			if (distance[j] - distance[i] > maxDis) //如果不能行使到比i便宜的加油站
    			{
    				j--;                                            //先行使到加满油可以达到的加油站
    				break;
    			}
    			if (price[j] <= price[i])//如果找到比i便宜的加油站 跳出当前循环
    				break;
    		}
    		if (price[j] <= price[i])// 1.break
    		{
    			total += ((distance[j] - distance[i]) / D2 - surplus)*price[i];
    			surplus = 0;
    		}
    		else
    		{
    			total += (C - surplus)*price[i];
    			surplus = C - (distance[j] - distance[i]) / D2;
    		}
    	}
    	printf("%.2f
    ", total);
    	return 0;
    }
    
    Yesterday is history,tomorrow ismystery,but today is a gift!That why it is called Present!
  • 相关阅读:
    题目1007:奥运排序问题(自定义排序问题)
    题目1005:Graduate Admission(录取算法)
    九度OJ小结2
    题目1049:字符串去特定字符(简单字符判断)
    题目1111:单词替换(字符串查找)
    题目1168:字符串的查找删除(字符串操作)
    题目1455:珍惜现在,感恩生活(多重背包问题)
    题目1454:Piggy-Bank(完全背包问题)
    题目1453:Greedy Tino(dp题目)
    题目1452:搬寝室(dp题目)
  • 原文地址:https://www.cnblogs.com/VictorierJwr/p/12878340.html
Copyright © 2020-2023  润新知