当前位置: 首页 > news >正文

深搜题(如何找到进入下一层深搜的条件)

如今许多普通百姓家有了私家车,一些人喜爱自己驾车从一个城市到另一个城市旅游。自己驾车旅游时总会碰到加油和吃饭的问题,在出发之前,驾车人总要想方设法得到从一个城市到另一个城市路线上的加油站的列表,列表中包括了所有加油站的位置及其每升的油价(如 3.25 元/L)。驾车者一般都有以下的习惯:

  1. 除非汽车无法用油箱里的汽油达到下一个加油站或目的地,在油箱里还有不少于最大容量一半的汽油时,驾驶员从不在加油站停下来;
  2. 在每一个停下的加油站总是将油箱加满;
  3. 在加油站加油的同时,买快餐等吃的东西花去 20 元。
  4. 从起始城市出发时油箱总是满的。
  5. 加油站付钱总是精确到 0.1 元(四舍五入)。
  6. 驾车者都知道自己的汽车每升汽油能够行驶的里程数。

现在要你帮忙做的就是编写一个程序,计算出驾车从一个城市到另一个城市的旅游在加油和吃饭方面最少的费用。

输入格式

第一行是一个实数,是从出发地到目的地的距离(单位:km)。

第二行是三个实数和一个整数,其中第一个实数是汽车油箱的最大容量(单位:L);第二个实数是汽车每升油能行驶的公里数;第三个实数是汽车在出发地加满油箱时的费用(单位:元);一个整数是 1 到 50 间的数,表示从出发地到目的地线路上加油站的数目。

接下来 n 行都是两个实数,第一个数表示从出发地到某一个加油站的距离(单位:km);第二个实数表示该加油站汽油的价格(单位:元)。

数据项中的每个数据都是正确的,不需判错。一条线路上的加油站根据其到出发地的距离递增排列并且都不会大于从出发地到目的地的距离。

输出格式

输出一个实数,即精确到 0.1 元的最小的加油和吃饭费用。

输入输出样例

输入 #1复制

600
40  8.5  128  3
200  3.52
350  3.45
500  365

输出 #1复制

13133.2

//我以为自己能写开这道题的,实际上写的时候也被难住了,难在了哪呢?dfs函数实现上,我没找到在同一深度时有什么不同选择项,感觉是个线性题,实则不然,只是我没从题目中提取出来罢了,看条件一,有种情况,油不够到下一个加油站那必定加油,否则再细分,若油超过1/2,就选择不加,到现在为止是否感觉还是线性的?但如果油不够1/2时便会出现两个选择项了,停下来加油或者不停,想到这层就好写了

//奉上代码

#include <bits/stdc++.h>

using namespace std;

struct stn

{

    double loc;

    double prc;

};

stn gas[64];

int dis, n;

double vol, per, cst, ans;

bool flg = true;

void dfs(double ful, int loc, double sum){

    if(loc == n + 1){

        if(flg){

            ans = sum;

            flg = false;

        }

        else if(sum < ans){

            ans = sum;

        }

        return;

    }

    if((gas[loc + 1].loc - gas[loc].loc) / per > ful){

        sum += 20;

        sum += gas[loc].prc * (vol - ful);

        ful = vol;

        ful -= (gas[loc + 1].loc - gas[loc].loc) / per;

        dfs(ful, loc + 1, sum);

    }

    else if(ful < vol / 2){

        dfs(ful - (gas[loc + 1].loc - gas[loc].loc) / per, loc + 1, sum);

        sum += 20;

        sum += gas[loc].prc * (vol - ful);

        ful = vol;

        ful -= (gas[loc + 1].loc - gas[loc].loc) / per;

        dfs(ful, loc + 1, sum);

    }

    else{

        ful -= (gas[loc + 1].loc - gas[loc].loc) / per;

        dfs(ful, loc + 1, sum);

    }

}

int main(int argc, char const *argv[])

{

    scanf("%d", &dis);

    scanf("%lf %lf %lf %d", &vol, &per, &cst, &n);

    for(int i = 1; i <= n; i ++)

        scanf("%lf %lf", &gas[i].loc, &gas[i].prc);

    gas[n + 1].loc = dis;

    gas[0].loc = 0;

    dfs(vol, 0, 0);

    printf("%.1lf", ans + cst);

    return 0;

}

http://www.xdnf.cn/news/597961.html

相关文章:

  • 第十九章 ADC——电压采集
  • ZeroMQ Sockets介绍及应用示例
  • 01_消息中间件概述
  • for...in 和 for...of:用法、区别
  • Vue2 项目报错问题收录(持续更新...)
  • 101个α因子#21
  • 火语言UI组件--控件事件触发
  • Vaptcha 手势、轨迹验证码
  • idea常用配置 properties中文输出乱码
  • AI智慧高光谱遥感实战精修班暨手撕99个案例项目、全覆盖技术链与应用场景一站式提升方案
  • 车载软件架构 --- FLASH bootloader 设计要点
  • 随机链表的复制问题详解与代码实现
  • python学习打卡day33
  • 等离子体隐身技术和小型等离子体防御装置设计
  • 军事目标系列之迷彩作战人员检测数据集VOC+YOLO格式2755张1类别
  • C#中WSDL文件引用问题
  • 【接近平均分配箱子数量】2022-1-23
  • uni 常用api
  • 学习STC51单片机11(芯片为STC89C52RC)
  • 嵌入式软件架构规范之 - 分层设计
  • Linux终端输入有80个字符的限制处理
  • 【com.unity3d.player.UnityPlayer介绍】
  • Spring IoC 和 AOP -- 核心原理与高频面试题解析
  • 单测覆盖率和通过率的稳定性问题,以及POM文件依赖包版本一致性的挑战
  • 位运算及其算法
  • 解决wsl没代理的问题
  • 第4周_作业题_逐步构建你的深度神经网络
  • 论文解读 | 《药用真菌桑黄通过内质网应激 - 线粒体损伤诱导人宫颈癌细胞凋亡》
  • 从JDK 17到JDK 21:Java核心特性概述
  • Python之web错误处理与异常捕获