!!!!先看解析,后面附有代码!!!!!!! ,希望大家不懂的能认真看看,这些都是我在写的过程中不能理解,遇到的困难,然后弄懂之后总结出来给大家的,想学的一定要认真看完。

规律是:

贮油点之间相差500升,

从最后一站倒推回来的每次往返次数规律是:1、3、 5、 7 、9、 、、、、、

/*
    第一站距离终点:500/1                    贮油点500升 
    第二站距离终点:500 + 500/3                   500*2
    第三站        : 500 + 500/3 + 500/5           500*3
    ...
    ...
    ...
    */

题目:
一辆重型卡车欲穿过
1000
公里的沙漠,卡车耗汽油为
1

/
公里,卡车总载油能力为
500
公升。显然卡车装一次油是过不了沙漠的。因此司机必须设法在沿途建立若干个贮油点,使卡车能顺利穿过沙漠。试问司机如怎样建立这些贮油点?每一贮油点应存储多少汽油,才能使卡车以消耗最少汽油的代价通过沙漠?
 
 
 
刚开始我也不理解这个题目,明白之后其实这个程序一点都不难
题目说的是,刚开始在起点有很多油,这些油都是用来供你过沙漠的,但是多少油也要你算出来,经过一段距离就建立贮油点,放下一些油,往起点跑回去,(每两个贮油点之间往返跑的次数是不一样的)然后装满500升之后又跑回那个新建的贮油点。
 
PS:还有一个点需要知道,就是题目问的是最省油,所以每次距离下一个贮油点都要给500升给司机的车途中耗油。所以这个可以得知每个贮油点之间相差500升,注意不是相差500Km,因为你要往返运动。
 
 
途中你也会损失油量,但只要起点不能剩下油,全部运过去就行。到了刚刚新建的一个贮油点后,重复刚刚的步骤继续往前推进,运油前进一段距离(这个距离每个贮油点之间都不一样)。
 
注意!!!!:(每次往返回去装油的时候必须刚好耗光才算是最省油的)
如果你理解了我刚刚的说的意思,那么你就可以利用倒推法的。
因为是哟啊最省油的方法,所以最后一个贮油点距离终点一定是刚好500km,
因为这样司机到站刚好耗光所有油量,可得知最后一个贮油点是500升。
用我刚刚说的每个站点相差500升,那么往回倒推next站点就是1000->1500->2000.........->?(起点)。
然后往返次数也可以从最后一个站点推出来,假设最后一个站点是第一个站点,画图得知至少往返三次,两次放下油,有一次是中间回去装油的时候,也要耗掉油。那么第二个就是1000升,往返次数至少3次,(为什么是3次:因为上面我说了,每个贮油点距离都是不一样的,你要在最后一个贮油点放下500升,那么你就至少需要往返3次,有一次是空载,你要回去装油,你不可能一下子放下500,你途中也会损耗)
 
再往回倒推就是1500升,要在第二个放下1000升,那么需要至少五次,有两次空载,三次是放油的,因为车子只有500升容量,不能装太多,放三次油算是极限了,每次回去耗掉的和放下的必须刚好用光。下面的也是以此类推。
 
代码如下:
#include<stdio.h>
int main()
{ int oil[10];
int km[10];
km[0] = 500;//倒推第一站距离500km
oil[0] = 500; //倒推第一站500升
int i;
/*
第一站距离终点:500/1 贮油点500升
第二站距离终点:500 + 500/3 500*2
第三站 : 500 + 500/3 + 500/5 500*3
...
...
...
*/
int k = 0;
for(k = 0; km[k] <= 1000; k++)
{
km[k+1] = km[k] + 500/(2*(k+2)-1);//每一站距离终点的距离
oil[k+1] = oil[k] + 500;//每一站的油量 }
//printf("%d\n", km[k]);
//printf("%d", oil[k]);
km[k] = 1000;
/*
最后倒推到起点后,
距离终点应该是1000,
因为循环出来后km[k]可能不是1000,需要置为1000
*/ printf("站点\t距起点km\t站点贮油量\n");
for(i = 0; i <= k; i++)
{
printf("%d\t%d\t\t%d\n", i+1, 1000-km[k-i], oil[k-i]);
} return 0;
}

运行结果:

 
 

C语言:贮油点建设问题(详解题目意思)的更多相关文章

  1. Go语言Slice作为函数参数详解

    Go语言Slice作为函数参数详解 前言 首先要明确Go语言中实质只有值传递,引用传递和指针传递是相对于参数类型来说. 个人认为上诉的结论不对,把引用类型看做对指针的封装,一般封装为结构体,结构体是值 ...

  2. 状压DP入门详解+题目推荐

    在动态规划的题型中,一般叫什么DP就是怎么DP,状压DP也不例外 所谓状态压缩,一般是通过用01串表示状态,充分利用二进制数的特性,简化计算难度.举个例子,在棋盘上摆放棋子的题目中,我们可以用1表示当 ...

  3. quartz定时任务cron表达式讲解及翻译成现实语言的插件的使用详解

    cron表达式讲解 参见该网址: https://www.cnblogs.com/GarfieldTom/p/3746290.html cron表达式只有专业技术人员才看得懂,普通人不知道表达式是什么 ...

  4. GO语言数组和切片实例详解

    本文实例讲述了GO语言数组和切片的用法.分享给大家供大家参考.具体分析如下: 一.数组 与其他大多数语言类似,Go语言的数组也是一个元素类型相同的定长的序列. (1)数组的创建. 数组有3种创建方式: ...

  5. C语言:内存字节对齐详解[转载]

    一.什么是对齐,以及为什么要对齐: 1. 现代计算机中内存空间都是按照byte划分的,从理论上讲似乎对任何类型的变量的访问可以从任何地址开始,但实际情况是在访问特定变量的时候经常在特定的内存地址访问, ...

  6. Unix/Linux环境C编程入门教程(41) C语言库函数的文件操作详解

     上一篇博客我们讲解了如何使用Linux提供的文件操作函数,本文主要讲解使用C语言提供的文件操作的库函数. 1.函数介绍 fopen(打开文件) 相关函数 open,fclose 表头文件 #in ...

  7. C语言函数参数的传递详解

    一.三道考题 开讲之前,我先请你做三道题目.(嘿嘿,得先把你的头脑搞昏才行--唉呀,谁扔我鸡蛋?)考题一,程序代码如下:void Exchg1(int x, int y){   int tmp;    ...

  8. C语言缓冲区(缓存)详解

    缓冲区又称为缓存,它是内存空间的一部分.也就是说,在内存空间中预留了一定的存储空间,这些存储空间用来缓冲输入或输出的数据,这部分预留的空间就叫做缓冲区.缓冲区根据其对应的是输入设备还是输出设备,分为输 ...

  9. R语言do.call 函数用法详解

    虽然R语言有类型很丰富的数据结构,但是很多时候数据结构比较复杂,那么基本就会用到list这种结构的数据类型.但是list对象很难以文本的形式导出,因此需要一个函数能快速将复杂的list结构扁平化成da ...

  10. Go语言学习之8 goroutine详解、定时器与单元测试

    主要内容: 1.Goroutine2. Chanel3. 单元测试 1. Goroutine Go 协程(Goroutine)(轻量级的线程,开线程没有数量限制).   (1)进程和线程 A. 进程是 ...

随机推荐

  1. 深入解析 C 语言中的 for 循环、break 和 continue

    C语言中的 for 循环 当您确切地知道要循环执行代码块的次数时,可以使用 for 循环而不是 while 循环 for (语句 1; 语句 2; 语句 3) {   // 要执行的代码块 } 语句 ...

  2. Docker学习路线12:开发者体验

    到目前为止,我们只讨论了使用Docker来部署应用程序.然而,Docker也是一个极好的用于开发应用程序的工具.可以采用一些不同的建议来改善开发体验. 在应用程序中使用docker-compose以方 ...

  3. Qt搜索本机网卡对应网段的在线设备

    需求:销售给我的需求是找出哪些IP是没有被占用的,所以我要先找出已经被占用的IP 项目是Qt开发的,所以在网上搜索了下,搜索到的实现方式都是:QHostInfo::lookupHost,但是这种方式, ...

  4. HarmonyOS应用性能与功耗云测试

    性能测试 性能测试主要验证HarmonyOS应用在华为真机设备上运行的性能问题,包括启动时长.界面显示.CPU占用和内存占用.具体性能测试项的详细说明请参考性能测试标准. 性能测试支持Phone和TV ...

  5. ASP.NET 部署常见问题及解决方案

    ASP.NET 部署部署过程中常见问题及解决方案 Could not load file or assembly 'XXXXX' or one of its dependencies. Access ...

  6. 重新整理 .net core 实践篇————防跨站脚本攻击[四十]

    前言 简单整理一下跨站脚本攻击. 正文 攻击原理是这样子的: 这种攻击被攻击的面挺多的,比如说只要有一个可以让用户输入的注入脚本就都是一个问题. 给网站注入脚本 然后用户访问给网站注入的脚本 脚本里面 ...

  7. node nvm使用

    背景 node 经过了一次大的改变,直接从8到了10,差别很大,但是有的项目又需要用到8,这个时候不能完全升级. 所以我们需要一个管理虚拟环境的工具. 安装 https://github.com/co ...

  8. c# 深克隆与浅克隆

    前言 我们都知道memberwiseclone 会将浅克隆. 什么是浅克隆?如何深克隆呢? 正文 public class good{ private good(){ oneclass=new cla ...

  9. leetcode:1380. 矩阵中的幸运数

    1380. 矩阵中的幸运数 给你一个 m * n 的矩阵,矩阵中的数字 各不相同 .请你按 任意 顺序返回矩阵中的所有幸运数. 幸运数是指矩阵中满足同时下列两个条件的元素: 在同一行的所有元素中最小 ...

  10. oracle SQL 进行时间冲突判断

    oracle SQL 进行时间冲突判断 背景:写一个预约模块,主要的限制就是时间限制,有冲突的时间段就不能进行预约 设数据库中的时间为A开始,A结束 设要判断的时间为B开始,B结束 则判断有在B开始时 ...