储油点问题 C语言/C++语言 最详细版,附含第0点储油量大家的值不同的解释

2023-12-07 08:40

本文主要是介绍储油点问题 C语言/C++语言 最详细版,附含第0点储油量大家的值不同的解释,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

问题:
一辆重型卡车欲穿过1000公里的沙漠,卡车耗油为1升/公里,卡车总载油能力为500升。显然,卡车装一次油是过不了沙漠的。因此,司机必须设法在沿途建立几个储油点,使卡车能够顺利穿越沙漠。试问:司机如何建立这些储油点?每一储油点应储存多少油,才能使卡车以消耗最少汽油的代价通过沙漠?
算法分析:
编程计算及打印建立储油点的序号,各储油点距离沙漠边缘的出发距离以及储油量。

题目有点难理解,我来解释一下吧。

先看最终要的结果:(这个不是正确的,往下看

题目啥意思呢,其实就是问要怎样才能通过沙漠,卡车装满油最多只能500公里,剩下的500公里没有油跑了,怎么办呢,储存油呗,然后就是题目真正问题了,就是该怎么储存所需要的油具体的说:

 

设储油点编号为:0,1,……i, i+1,……n,(n为最后一个)由题目的意思可知,最后一个储油点n应该是在距离终点500公里的地方(因为剩下的这500公里刚好是可以一车油跑完的嘛),那么现在的问题就是该怎么在倒数第二储(即:n-1)油点 储存满500升油呢,而且还要保证车开到n-1这点时,把剩余油全部储存进去后刚好500升(可以理解为装满500升油的同时车又是刚好耗空了所有油。)

!!!!!!!!!!!!!!!!逆向思维!!!!!!!!!!!!!!!!!!!!

提示一下:车是不可能直接一次就把500升油存满的,跑到那个点去的路途上是要耗油的吧,存了一部分油还得留一部分返回去拉第二趟的油吧。

就是说在n-1这个点时车要把油分成三份(500/3的三等份),花500的三分之一去往n这个点,然后存500的三分之一进去,再花剩余的三分之一回到n-1这个点,然后第二趟又是装500升满的去往n这个点,路途还是花掉500的三分之一,剩余2/3,全部存进n点去,n点刚好500升,自己也刚好没有油了,再把500升全拿出去装车,刚好能跑完剩下的500公里。  ……以此类推……

分析一下:

        用oil(i)表示第 i 个点的储油量,dis(i)表示第 i 点到终点的距离(0<i<n);

        (注意,这不是题目求的到出发点距离,1000-dis[i] 才是)。

           

最后个点        n :距离dis[n]=500;油 oil(n)=500;

倒数第个点  n-1:距离dis[n-1]=dis[n]+500/3;  油oil[n-1]=2*500  ( 拉了两趟嘛,每趟500 )

继续推下去可知n-2: 距离dis[n-2]=dis[n-1]+500/5;油oil[n-2]=3*500

………………

是不是可以发现规律了。

倒过来算储油点,把最后一个算第 1 个点,倒数第二个算第 2 个点,……第一个算最后一个 n点;

那么规律不就是这样嘛:

第 i 点 :  距离:dis[i]=dis[i-1]+(2*n-1);

                    油:oil[i] =i*500;

这下就会了吧。

献上代码(若对13、14行不理解,看后面解释):

#include<iostream>
using namespace std;
int main(){int i=0,k=1;float dis[10],oil[10];dis[0]=oil[0]=0;dis[1]=oil[1]=500;while(dis[k]<=1000){k++;dis[k]=dis[k-1]+500/(2*k-1);oil[k]=k*500;}dis[k]=1000;oil[k]=(1000-dis[k-1])*(2*k-1)+oil[k-1];cout<<"NO.	distance(k.m)	oil(l.)"<<endl;for(k;k>=0;k--)cout<<i++<<"	"<<1000-dis[k]<<"		"<<oil[k]<<endl; return 0;
}

        因为总长只有1000公里,代码里第k个点(额……也就是题目求的第一点)应该是距离终点1000公里,距离起点0公里才对,而如果没有这两句(可以注释这两句后运行看一下,结果会是下面这样子),求出来的点表示的已经是距离终点1008公里,起点 -8公里的点了,明显不对,所以只能单独求解;

距离好求,就是1000公里。

储油量呢,应该是上一个点所需要的油量 oil[k-1] 加上往返(2*k-1次)跑的路程(1000-dis[k-1)所需要消耗的油量对吧,这个很好理解吧

所以oil[k]=(1000-dis[k-1])*(2*k-1)+oil[k-1];

C语言:

#include<stdio.h>
int main(){int i=0,k=1;float dis[10],oil[10];dis[0]=oil[0]=0.0;dis[1]=oil[1]=500.0;while(dis[k]<=1000){k++;dis[k]=dis[k-1]+500.0/(2*k-1);oil[k]=k*500.0;}dis[k]=1000.0;oil[k]=(1000.0-dis[k-1])*(2*k-1)+oil[k-1];printf("NO.	distance(k.m)	oil(l.)\n");for(k;k>=0;k--)printf("%d	%.2f		%.2f\n",i++,1000.0-dis[k],oil[k]);return 0;
}

改成浮点型了

 

特别提醒:

关于第0个储油点的油量,我看到了很多的答案,发现大家的有些出入,于是我特意验算了一下:

由第1 个点22.43公里可以算出:

起点到第 1 个点距离22.43公里,要往第 1 个点存 3500升油。

第一趟:去耗22.43升,存455.14升,留22.43升回起点

第二趟:……… ,        存了910.28升,…………

第三趟:……… ,        存了1365.42升,…………

第四趟:……… ,        存了1820.56升,…………

第五趟:……… ,        存了2275.70升,…………

第六趟:……… ,        存了2730.84升,…………

第七趟:……… ,        存了3185.98升,…………

第八趟:耗22.43升,加这次够3500升了,无需返回了,全存,有3663.54升(装500升多了)

多了 3663.55-3500=136.55升,应该减掉

实际应该装 500-136.55=336.45 升

也就是前七趟都是拉500升(7*500)去第 1 点,而第八趟拉336.45升去第 1点就可以了,所以出发点需要7*500+336.45=3836.45升油(因为电脑计算有精度丢失,所以小数存在了0.05的误差

综上所诉:3836.XX这个值才是正确的,切记。

这篇关于储油点问题 C语言/C++语言 最详细版,附含第0点储油量大家的值不同的解释的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/465216

相关文章

Apache Ignite 与 Spring Boot 集成详细指南

《ApacheIgnite与SpringBoot集成详细指南》ApacheIgnite官方指南详解如何通过SpringBootStarter扩展实现自动配置,支持厚/轻客户端模式,简化Ign... 目录 一、背景:为什么需要这个集成? 二、两种集成方式(对应两种客户端模型) 三、方式一:自动配置 Thick

解决pandas无法读取csv文件数据的问题

《解决pandas无法读取csv文件数据的问题》本文讲述作者用Pandas读取CSV文件时因参数设置不当导致数据错位,通过调整delimiter和on_bad_lines参数最终解决问题,并强调正确参... 目录一、前言二、问题复现1. 问题2. 通过 on_bad_lines=‘warn’ 跳过异常数据3

解决RocketMQ的幂等性问题

《解决RocketMQ的幂等性问题》重复消费因调用链路长、消息发送超时或消费者故障导致,通过生产者消息查询、Redis缓存及消费者唯一主键可以确保幂等性,避免重复处理,本文主要介绍了解决RocketM... 目录造成重复消费的原因解决方法生产者端消费者端代码实现造成重复消费的原因当系统的调用链路比较长的时

C++11范围for初始化列表auto decltype详解

《C++11范围for初始化列表autodecltype详解》C++11引入auto类型推导、decltype类型推断、统一列表初始化、范围for循环及智能指针,提升代码简洁性、类型安全与资源管理效... 目录C++11新特性1. 自动类型推导auto1.1 基本语法2. decltype3. 列表初始化3

深度解析Nginx日志分析与499状态码问题解决

《深度解析Nginx日志分析与499状态码问题解决》在Web服务器运维和性能优化过程中,Nginx日志是排查问题的重要依据,本文将围绕Nginx日志分析、499状态码的成因、排查方法及解决方案展开讨论... 目录前言1. Nginx日志基础1.1 Nginx日志存放位置1.2 Nginx日志格式2. 499

C++11右值引用与Lambda表达式的使用

《C++11右值引用与Lambda表达式的使用》C++11引入右值引用,实现移动语义提升性能,支持资源转移与完美转发;同时引入Lambda表达式,简化匿名函数定义,通过捕获列表和参数列表灵活处理变量... 目录C++11新特性右值引用和移动语义左值 / 右值常见的左值和右值移动语义移动构造函数移动复制运算符

kkFileView启动报错:报错2003端口占用的问题及解决

《kkFileView启动报错:报错2003端口占用的问题及解决》kkFileView启动报错因office组件2003端口未关闭,解决:查杀占用端口的进程,终止Java进程,使用shutdown.s... 目录原因解决总结kkFileViewjavascript启动报错启动office组件失败,请检查of

Python对接支付宝支付之使用AliPay实现的详细操作指南

《Python对接支付宝支付之使用AliPay实现的详细操作指南》支付宝没有提供PythonSDK,但是强大的github就有提供python-alipay-sdk,封装里很多复杂操作,使用这个我们就... 目录一、引言二、准备工作2.1 支付宝开放平台入驻与应用创建2.2 密钥生成与配置2.3 安装ali

2025版mysql8.0.41 winx64 手动安装详细教程

《2025版mysql8.0.41winx64手动安装详细教程》本文指导Windows系统下MySQL安装配置,包含解压、设置环境变量、my.ini配置、初始化密码获取、服务安装与手动启动等步骤,... 目录一、下载安装包二、配置环境变量三、安装配置四、启动 mysql 服务,修改密码一、下载安装包安装地

在macOS上安装jenv管理JDK版本的详细步骤

《在macOS上安装jenv管理JDK版本的详细步骤》jEnv是一个命令行工具,正如它的官网所宣称的那样,它是来让你忘记怎么配置JAVA_HOME环境变量的神队友,:本文主要介绍在macOS上安装... 目录前言安装 jenv添加 JDK 版本到 jenv切换 JDK 版本总结前言China编程在开发 Java