算法刷题day13

news2024/11/29 1:47:00

目录

  • 引言
  • 一、蜗牛

引言

今天时间有点紧,只搞了一道题目,不过确实搞了三个小时,才搞完,主要是也有点晚了,也好累啊,不过也还是可以的,学了状态DP,把建图和spfa算法熟悉了一下,明天再接再厉。


一、蜗牛

标签:状态机DP

思路1:这个因为还没学所以第一时间没有这个DP的概念就拿最短路做的,spfa算法过了两个数据(总共十个),然后其实没问题,就是图建的不太完善,建图是觉得每次传送结束都要回到x轴,现在觉得可以继续走当前杆的下一个传送门再传送到下一个杆,因为每两个之间都有传送门,所以每根杆最多有两个传送门
思路2:直接用状态机DP,定义为两个状态f[i][2],分别代表第一次到达杆子的底端和b[i],然后结果就是两种情况:min(f[n][0],f[n][1]+b[n]/1.3),然后每次推f[i][0]、f[i][1]
i n t   d = x [ i ] − x [ i − 1 ] ; int\ d = x[i] - x[i-1]; int d=x[i]x[i1]; f [ i ] [ 0 ] = m i n ( f [ i − 1 ] [ 0 ] + d , f [ i − 1 ] [ 1 ] + g e t ( b [ i − 1 ] , 0 ) + d ) ; f[i][0] = min(f[i-1][0] + d, f[i-1][1] + get(b[i-1], 0) + d); f[i][0]=min(f[i1][0]+d,f[i1][1]+get(b[i1],0)+d); f [ i ] [ 1 ] = m i n ( f [ i − 1 ] [ 0 ] + g e t ( 0 , a [ i − 1 ] ) , f [ i − 1 ] [ 1 ] + g e t ( b [ i − 1 ] , a [ i − 1 ] ) ) ; f[i][1] = min(f[i-1][0] + get(0, a[i-1]), f[i-1][1] + get(b[i-1], a[i-1])); f[i][1]=min(f[i1][0]+get(0,a[i1]),f[i1][1]+get(b[i1],a[i1]));
在这里插入图片描述

题目描述:

示例代码一:spfa算法(过了2/10)

#include <cstdio>
#include <cstring>
#include <iostream>
#include <vector>
#include <cfloat>

using namespace std;

const int N = 1e5+10, M = N * 2;

int n;
int h[N], e[M], ne[M], idx;
double w[M];
double dist[N];
bool st[N];
int q[N];

void add(int a, int b, double c)
{
    e[idx] = b, w[idx] = c, ne[idx] = h[a], h[a] = idx++;
}

double spfa()
{
    for(int i = 0; i < N; ++i) dist[i] = DBL_MAX;
    dist[0] = 0;
    st[0] = true;
    
    int hh = 0, tt = -1;
    q[++tt] = 0;
    while(hh <= tt)
    {
        auto t = q[hh++];
        
        st[t] = false;
        
        for(int i = h[t]; i != -1; i = ne[i])
        {
            int j = e[i];
            
            if(dist[j] > dist[t] + w[i])
            {
                dist[j] = dist[t] + w[i];
                if(!st[j])
                {
                    q[++tt] = j;
                    st[j] = true;
                }
            }
            
        }
    }
    
    return dist[n];
}

int main()
{
    memset(h, -1, sizeof h);
    
    scanf("%d", &n);
    int a = 0, b;
    vector<int> path;
    for(int i = 0; i < n; ++i)
    {
        scanf("%d", &b);
        path.push_back(b);
        int c = b - a;
        add(a,b,c);
        a = b;
    }
    
    for(int i = 1; i < path.size(); ++i)
    {
        int a = path[i-1], b = path[i];
        int t1, t2;
        scanf("%d%d", &t1, &t2);
        double c = t1 / 0.7 + t2 / 1.3;
        add(a,b,c);
    }
    
    n = path.back();
    double res = spfa();
    
    printf("%.2f\n", res);
    
    return 0;
}

示例代码二:状态机DP

#include <cstdio>
#include <iostream>

using namespace std;

const int N = 1e5+10, INF = 2e9;

int n;
int x[N], a[N], b[N];
double f[N][2];

double get(double x1, double x2)
{
    if(x1 > x2) return (x1 - x2) / 1.3;
    return (x2 - x1) / 0.7;
}

int main()
{
    scanf("%d", &n);
    for(int i = 1; i <= n; ++i) scanf("%d", &x[i]);
    for(int i = 1; i < n; ++i) scanf("%d%d", &a[i], &b[i+1]);
    
    for(int i = 0; i < n; ++i) f[i][0] = f[i][1] = INF;
    
    f[1][0] = x[1];
    for(int i = 2; i <= n; ++i)
    {
        int d = x[i] - x[i-1];
        f[i][0] = min(f[i-1][0] + d, f[i-1][1] + get(b[i-1], 0) + d);
        f[i][1] = min(f[i-1][0] + get(0, a[i-1]), f[i-1][1] + get(b[i-1], a[i-1]));
    }
    
    printf("%.2f\n", min(f[n][0], f[n][1] + get(b[n], 0) ) );
    
    return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1450296.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

[嵌入式AI从0开始到入土]14_orangepi_aipro小修补含yolov7多线程案例

[嵌入式AI从0开始到入土]嵌入式AI系列教程 注&#xff1a;等我摸完鱼再把链接补上 可以关注我的B站号工具人呵呵的个人空间&#xff0c;后期会考虑出视频教程&#xff0c;务必催更&#xff0c;以防我变身鸽王。 第1期 昇腾Altas 200 DK上手 第2期 下载昇腾案例并运行 第3期 官…

openGauss学习笔记-221 openGauss性能调优-确定性能调优范围-分析作业是否被阻塞

文章目录 openGauss学习笔记-221 openGauss性能调优-确定性能调优范围-分析作业是否被阻塞221.1 操作步骤 openGauss学习笔记-221 openGauss性能调优-确定性能调优范围-分析作业是否被阻塞 数据库系统运行时&#xff0c;在某些业务场景下查询语句会被阻塞&#xff0c;导致语句…

备战蓝桥杯---图论之最短路dijkstra算法

目录 先分个类吧&#xff1a; 1.对于有向无环图&#xff0c;我们直接拓扑排序&#xff0c;和AOE网类似&#xff0c;把取max改成min即可。 2.边权全部相等&#xff0c;直接BFS即可 3.单源点最短路 从一个点出发&#xff0c;到达其他顶点的最短路长度。 Dijkstra算法&#x…

vmware workstation群晖虚拟机vmdk文件导出

为了防止群晖虚拟机中整个挂掉&#xff0c;里面的文件导不出来&#xff0c;尝试直接从vmdk中获取内容。 1、想采用diskgenius去读取文件&#xff0c;发现volume1是空的。只能读取群晖的系统文件。 2、选择另一个linux系统的虚拟机&#xff0c;选择对应的vmdk 3、如果有文件管理…

Python slice函数

在Python编程中&#xff0c;slice&#xff08;切片&#xff09;操作是一种强大且灵活的方式&#xff0c;用于从序列&#xff08;如列表、元组、字符串等&#xff09;中获取子序列。通过切片操作&#xff0c;可以轻松地提取序列中的一部分&#xff0c;进行遍历、修改、复制等操作…

springboot185基于vue.js的客户关系管理系统(crm)的设计与实现

简介 【毕设源码推荐 javaweb 项目】基于springbootvue 的 适用于计算机类毕业设计&#xff0c;课程设计参考与学习用途。仅供学习参考&#xff0c; 不得用于商业或者非法用途&#xff0c;否则&#xff0c;一切后果请用户自负。 看运行截图看 第五章 第四章 获取资料方式 **项…

C语言学习day13:嵌套循环+练习题(时钟+乘法表)

嵌套循环通常是外面一层for循环&#xff0c;里面n层for循环 代码&#xff1a; int main1601() {//外层执行一次&#xff0c;内层执行一周for (int i 0; i < 5; i){for (int j 0; j < 5; j){printf("i%d,j%d\n",i,j);}}system("pause");return EX…

每日一练:LeeCode-98、 验证二叉搜索树【二叉搜索树+DFS】

本文是力扣LeeCode-98、 验证二叉搜索树【二叉搜索树DFS】】 学习与理解过程&#xff0c;本文仅做学习之用&#xff0c;对本题感兴趣的小伙伴可以出门左拐LeeCode。 给你一个二叉树的根节点 root &#xff0c;判断其是否是一个有效的二叉搜索树。 有效 二叉搜索树定义如下&am…

Editing While Playing 使用 Easyx 开发的 RPG 地图编辑器 tilemap eaitor

AWSD移动画布 鼠标右键长按拖拽 鼠标左键长按绘制 可以边拖拽边移动画布边绘制。 F1 导出 DLC F2 导入DLC author: 民用级脑的研发记录 1309602336qq.com 开发环境&#xff1a; 内置 easyx 的 devc 5.11 或者 VS 2022 TDM GCC 4.9.2 64-bit c11及以上都可运行 windows 环境运行…

[BIZ] - 1.金融交易系统特点

1. 典型数据汇总 数据 说明 新增数据量(条/天) Qps(条/s) 消息大小(Byte) 实时性 可丢失性 可恢复性 实时行情 1.使用场景&#xff1a;交易&#xff0c;报价&#xff0c;策略验证&#xff1b; 2.冷热分离&#xff1a;彭博行情/其他行情&#xff1b;黄金&期货行情/…

node+vue3+mysql前后分离开发范式——实现对数据库表的增删改查

文章目录 ⭐前言⭐ 功能设计与实现💖 node后端操作数据库实现增删改查💖 vue3前端实现增删改查⭐ 效果⭐ 总结⭐ 结束⭐结束⭐前言 大家好,我是yma16,本文分享关于 node+vue3+mysql前后分离开发范式——实现对数据库表的增删改查。 技术选型 前端:vite+vue3+antd 后端:…

编程语言的实际应用场景(C语言场景)

从应用范围上来说&#xff0c;这些编程语言大致可以分为两种&#xff1a; 一种是专用型语言&#xff0c;也就是针对某个特定领域而设计出来的语言&#xff1b;另一种是通用型语言&#xff0c;它们可以开发多种类型的应用程序&#xff0c;而不是局限在某个特定的领域。 专用型…

[职场] 投资顾问是做什么? #知识分享#其他#微信

投资顾问是做什么&#xff1f; 投资顾问是指专门从事于提供投资建议而获薪酬的人士&#xff0c;它是投资服务中非常重要的角色。投资顾问&#xff0c;有广义和狭义之分。广义的投资顾问&#xff0c;可以是指为金融投资、房地产投资、商品投资等各类投资领域提供专业建议的专业人…

UI文件原理

使用UI文件创建界面很轻松很便捷&#xff0c;他的原理就是每次我们保存UI文件的时候&#xff0c;QtCreator就自动帮我们将UI文件翻译成C的图形界面创建代码。可以通过以下步骤查看代码 到工程编译目录&#xff0c;一般就是工程同级目录下会生成另一个编译目录&#xff0c;会找到…

QT 工具栏 状态栏 停靠部件 核心部件

添加/删除工具栏 删除工具栏方法和删除菜单栏方法一样&#xff0c;不过工具栏可以有多个&#xff0c;所以每次右键MainWindow对象&#xff0c;都可以看到添加工具栏的选项。 工具栏添加动作 新添加的QAction对象会在动作编辑器里找到&#xff08;Action Editor&#xff09;&a…

算法之贪心

1.部分背包问题 代码1&#xff1a; 代码2&#xff1a; 但如果金币不能分割&#xff0c;那贪心就不是最优解&#xff0c;正确的做法是搜索或动态规划。 2.排队接水 3.在规定时间内参加最多的比赛 4.合并果子 使用memset初始化int数组时&#xff0c;第二个参数如果是0&#xff0…

vscode运行C/C++时候cmd.exe界面显示

写了一些命令行传参的程序&#xff0c;需要终端输入参数&#xff0c;默认是输出结果显示在它自己的终端界面 Code-runner: Run In Terminal 打勾就行 效果&#xff1a;

平时积累的FPGA知识点(6)

平时在FPGA群聊等积累的FPGA知识点&#xff0c;第六期&#xff1a; 1 万兆网接口&#xff0c;发三十万包&#xff0c;会出现掉几包的情况&#xff0c;为什么&#xff1f; 原因&#xff1a;没做时钟约束&#xff0c;万兆网接口的实现&#xff0c;本质上都是高速serdes&#xf…

Vue源码系列讲解——模板编译篇【二】(整体运行流程)

目录 1. 整体流程 2. 回到源码 3. 总结 1. 整体流程 上篇文章中我们说了&#xff0c;在模板解析阶段主要做的工作是把用户在<template></template>标签内写的模板使用正则等方式解析成抽象语法树&#xff08;AST&#xff09;。而这一阶段在源码中对应解析器&…

跟着pink老师前端入门教程-day26

一、计算机编程基础 &#xff08;一&#xff09;编程语言 1、编程 编程&#xff1a;就是让计算机为解决某个问题而使用某种程序设计语言编写程序代码&#xff0c;并最终得到结果的过程。 计算机程序&#xff1a;就是计算机所执行的一系列的指令集合&#xff0c;而程序全部…