【NOJ1149】【算法实验四】【DP_动态规划】旅游预算/加油站问题
1149.旅游预算
时限:1000ms 内存限制:10000K 总时限:3000ms
描述
一个旅行社需要估算乘汽车从某城市到另一城市的最小费用,沿路有若干加油站,每个加油站收费不一定相同。
旅游预算有如下规则:
1、若油箱的油过半,不停车加油,除非油箱中的油不可支持到下一站;
2、每次加油时都加满;
3、在一个加油站加油时,司机要花费2元买东西吃;
4、司机不必为其他意外情况而准备额外的油;
5、汽车开出时在起点加满油箱;
6、计算精确到分(1元=100分)。编写程序估计实际行驶在某路线所需的最小费用。
输入
第一行为起点到终点的距离(实数);
第二行为三个实数,后跟一个整数,每两个数据间用一个空格隔开。
其中第一个数为汽车油箱的容量(升),第二个数是每升汽油行驶的公里数,第三个数是在起点加满油箱的费用(精确到分),第四个数是加油站的数量。(〈=50)。(注:起点和终点没有加油站)
接下去的每行包括两个实数,每个数据之间用一个空格分隔,其中第一个数是该加油站离起点的距离,第二个数是该加油站每升汽油的价格(元/升)。
加油站按它们与起点的距离升序排列。所有的输入都一定有解。
输出
共两行,每行都有换行。
第一行为一个实数和一个整数,实数为旅行的最小费用,以元为单位,精确到分,整数表示途中加油的站的个数有N个。
第二行是N个整数,表示N个加油的站的编号,按升序排列。数据间用一个空格分隔,最后一个数据后也输出空格,此外没有多余的空格。
#include <iostream>
#include <stdio.h>
#include <float.h>using namespace std;/********输入数据部分*******/
double length;
double capa,mile,cost;
int n;double dis[51];
double price[50];
/****************************//****算法中用到的其他变量***/
bool isAdd[50]; //在第i个加油站是否加油double min_cost[50]; //备忘录int cnt;double maxdis; //加满油后能走的最大距离
/****************************//**********函数声明*********/
double dp(int i); //返回“从第i个加油站满油出发,到达终点的最小费用”void input(); //输入数据
void init(); //变量初始化
void output(double mincost); //输出数据
/****************************/int main()
{input(); //输入数据init(); //变量初始化double mincost=dp(0); //计算得到最小费用output(mincost); //输出数据return 0;
}void input() //输入数据
{//第一行cin>>length;//第二行cin>>capa>>mile>>cost>>n;//接下去的n行for(int i=1; i<=n; i++) //加油站从1开始编号{cin>>dis[i]>>price[i]; //输入距离和油价}dis[0]=0; //假设起点为第0个加油站(实际上没有)dis[n+1]=length; //假设终点为第n+1个加油站(实际上没有)
}void init() //变量初始化
{for(int i=1; i<=n+1; i++){isAdd[i]=false; //每个加油站初始化为不加油min_cost[i]=DBL_MAX; //从加油站i到终点的费用设为最大值}min_cost[0]=DBL_MAX; //从起点到终点的费用设为最大值cnt=0; //需要加油的加油站个数maxdis=capa*mile; //加满油后能到达的最大距离
}double dp(int i) //满油状态从加油站i到终点的最小花费
{if(i==n+1) //到达终点{return cost; //算上“在起点加满油的费用”}else if(min_cost[i]!=DBL_MAX) //备忘录中有记录{return min_cost[i]; //直接返回}else //若备忘录中无记录,则需要计算填写{double fuel_j; //从加油站i到达加油站j耗费的油量double fuel_remain; //从加油站i到达加油站j后,剩下的油量double cost_j; //从加油站i到达加油站j,并在加油站j加满油的费用double cost_j_n; //从加油站i,经过加油站j加油并到达终点的总费用int min_j=-1; //记录需要加油的加油站下标for(int j=i+1; j<=n+1&&(dis[j]-dis[i])<=maxdis; j++) //遍历从加油站i出发,能够到达的加油站j{fuel_j=(dis[j]-dis[i])/mile; //计算从加油站i到达加油站j耗费的油量fuel_remain=capa-fuel_j; //计算到达加油站j后剩下的油量if(fuel_remain>capa/2 //如果剩下的油超过一半&&fuel_remain*mile>=(dis[j+1]-dis[j])) //而且剩下的油能够到达第j+1个加油站{continue; //那么规则不允许加油}if(j==n+1) //如果能直接到达终点{cost_j=0; //到达终点不用加油,也不用算油费了}else //否贼就要在加油站j加满油{cost_j=2; //给司机买糖吃cost_j+=fuel_j*price[j]; //加满油的费用=耗费的油*油价}cost_j_n=cost_j+dp(j); //从i到达终点的费用=从i到达j的费用+从j到达终点的费用if(min_cost[i]>cost_j_n) //遍历j时,取最小的“从i到达终点的费用”{min_cost[i]=cost_j_n; //记录从i到终点的最小费用min_j=j; //记录从i到终点的途中曾在加油站j加过油}}if(min_j!=-1) //如果min_j不等于初始值,证明途中加过油{isAdd[min_j]=true; //记录从i到终点的途中曾在第min_j个收费站加过油}return min_cost[i]; //返回从i到终点的最小费用}
}void output(double mincost)
{//输出第一行printf("%.2f ",mincost);//计算并输出加油次数for(int i=1; i<=n; i++){if(isAdd[i]){cnt++;}}cout<<cnt<<endl;//输出第二行for(int i=1; i<=n; i++){if(isAdd[i]){cout<<i<<' ';}}cout<<endl;
}
【后记】
1.一次次提交终于AC了,好累啊不想写后记_(°:з」∠)_(秃头趴,有时间来补后记吧
【NOJ1149】【算法实验四】【DP_动态规划】旅游预算/加油站问题相关推荐
- 深大算法实验四——流水线问题
代码链接:深大算法实验四--车间动态规划代码-C++文档类资源-CSDN下载 目录 实验目的与要求: 实验过程及内容: 蛮力法: 动态规划法: 改进 空间优化方案: 问题1,关于最优解的存储方案 问题 ...
- CUMTOJ算法实验四
CUMTOJ算法实验四 问题 A: 判断日期是否符合格式 题目描述 我们知道一年有12个月,每个月最多有31天,年有平年和闰年之分,本题目要求如果输入一个日期,程序需要判断用户输入的日期是否正确. 提 ...
- 【NOJ1149】【算法实验四】旅游预算
1149.旅游预算 时限:1000ms 内存限制:10000K 总时限:3000ms 描述 一个旅行社需要估算乘汽车从某城市到另一城市的最小费用,沿路有若干加油站,每个加油站收费不一定相同.旅游预算有 ...
- matlab信息隐藏算法,实验四--基于DCT域的信息隐藏算法
<实验四--基于DCT域的信息隐藏算法>由会员分享,可在线阅读,更多相关<实验四--基于DCT域的信息隐藏算法(6页珍藏版)>请在人人文库网上搜索. 1.实验四 基于DCT域的 ...
- 【算法实验四】--【动态规划】--防卫导弹
1046.防卫导弹 时限:1000ms 内存限制:10000K 总时限:3000ms 描述 一种新型的防卫导弹可截击多个攻击导弹.它可以向前飞行,也可以用很快的速度向下飞行,可以毫无损伤地截击进攻导 ...
- 建模算法(四)——动态规划
其实我们对着规划接触的最多最熟悉,简单来说就是一个递归问题,递归问题简单的在的地方,编程实现的难度下降了,难的地方是如何构造递归,不好的地方是资源的浪费,但是有些地方编程实现的简单的优势可以无视掉他的 ...
- 【NOJ1047】【算法实验四】田忌赛马(tian ji racing)
1047.田忌赛马(tian ji racing) 时限:1000ms 内存限制:10000K 总时限:3000ms 描述 田忌与齐王赛马,双方各有n匹马参赛(n<=100),每场比赛赌注为1两 ...
- 【算法实验四】(DP-动态规划)【花生米3】
1084.花生米(三) 时限:1000ms 内存限制:10000K 总时限:3000ms 描述 五一长假第三天,Tom和Jerry在仓库散步的时候又发现了一堆花生米(仓库,又见仓库--).这次Tom ...
- 算法分析与设计实验报告三——动态规划算法
一.实验目的 掌握动态规划方法贪心算法思想 掌握最优子结构原理 了解动态规划一般问题 二.实验内容 编写一个简单的程序,解决0-1背包问题.设N=5,C=10,w={2,2,6,5,4},v={6,3 ...
最新文章
- python怎么变成动图_python简单的图片切换形成动画效果程序
- pycharm 修改新建文件时的头部模板
- 对正则表达式又重新学了一遍,笔记方便以后查阅
- redistemplate给hash存储设置有效期_客户端较为常用的存储机制
- oracle下载jdk需要注册怎么办? jdk8下载
- 【Codeforces613D】Kingdom and its Cities【虚树】【Tree DP】倍增lca
- python输入自己的出生年月日命运_出生年月日五行查询表 免费五行缺失查询表...
- 写了一个Mac快速设置、打开和关闭Web代理的Shell命令
- Redhat相关快捷键
- 大学计算机基础教程excel实验报告,大学计算机基础教程excel实验报告.doc
- 微信小程序---判断苹果11及以上型号手机
- 软件需求工程 高校教学平台 需求变更控制会规程
- 基于百度AI和QT的景物识别系统
- 数据结构——冒泡排序
- 使用SCA逆向VM虚拟机
- 数据库关系代数练习题解释
- 微x怎么设置主题_爱逛直播怎么玩才有效果?SOP全流程在这!
- android 多个自定义dialog
- 各大网站RSS订阅源地址
- 生物信息学|通过基于多模态注意机制的卷积编码器进行可解释的抗癌化合物灵敏度预测