0x57 内容简介与例题习题

沁恒蓝牙芯片CH57x系列学习与应用 沁恒蓝牙芯片CH57x系列学习与应用 沁恒的蓝牙芯片例程已经将各个函数集合的很高,不同主从机例程的主函数中,往往只有一至两个的函数调用的区别,但是在这一到两个函数中,差别却是很大的。 以沁恒的外设从机例程Peripheral为例,进行学习与应用。 但是不懂的地方还有很多,本次学习只是大概梳理了下整体程序的顺序,很多地方的了解只局限于程序本身的注释,也希望能够和大家讨论学习。 注:我是用的是沁恒的CH573F芯片,用的软件是Mounriver Studio。 Peripheral例程的主函数如下所示: int 阅读详情

《算法竞赛进阶指南》读书笔记汇总
这里面是我在阅读《算法竞赛进阶指南》这本书时的一些思考,有兴趣可以瞧瞧!
如若发现什么问题,可以通过评论或者私信作者提出。希望各位大佬不吝赐教!
许多问题都可以使用二叉堆来进行优化,下面直接看例题吧。

基本思想

倍增优化dp主要包括这样两个步骤:预处理和二进制拼凑答案。

【例题】开车旅行(AcWing293)

题目链接
思路:
这道题非常麻烦非常麻烦非常麻烦!
首先是预处理部分,我们预处理出以下数组:
在这里插入图片描述
预处理方式:
在这里插入图片描述
预处理出五个数组之后,我们就可以利用这些已知信息进行二进制拼凑,也就是倍增求解问题。
我们先看问题二,我们从大到小枚举旅行的距离(二进制枚举),判断当前A、B已经走的距离加上枚举的距离是否小于等于给定的 X X X,即将 X X X做二进制拆分。拆分过程中利用已经预处理好的数组计算AB分别走过的距离即可。
对于问题一,我们可以枚举所有的起点,更新最小值即可。

AC代码:

#include <algorithm>
#include <iostream>
#include <cstring>
#include <set>
#include <vector>

using namespace std;

typedef long long LL;
typedef pair<LL, int> PLI;

const int N = 100010, M = 17;
const LL INF = 1e12;

int n;
int h[N];
int ga[N], gb[N];
int f[M][N][2];
LL da[M][N][2], db[M][N][2];

void init_g()
{
    set<PLI> S;
    S.insert({INF, 0}), S.insert({INF + 1, 0});
    S.insert({-INF, 0}), S.insert({-INF - 1, 0});
    
    for (int i = n; i; i -- )
    {
        PLI t(h[i], i);
        auto j = S.lower_bound(t);
        j ++;
        
        vector<PLI> v;
        for (int k = 0; k < 4; k ++ )
        {
            v.push_back(*j);
            j --;
        }
        
        LL d1 = INF, d2 = INF;
        int p1 = 0, p2 = 0;
        for (int k = 3; k >= 0; k --)
        {
            LL d = abs(h[i] - v[k].first);
            if (d < d1)
            {
                d2 = d1, d1 = d;
                p2 = p1, p1 = v[k].second;
            }
            else if (d < d2)
            {
                d2 = d;
                p2 = v[k].second;
            }
        }
        ga[i] = p2, gb[i] = p1;
        S.insert(t);
    }
}

void init_f()
{
    for (int i = 0; i < M; i ++ )
        for (int j = 1; j <= n; j ++ )
        {
            if (!i) f[0][j][0] = ga[j], f[0][j][1] = gb[j];
            else
            {
                for (int k = 0; k < 2; k ++ )
                {
                    if (i == 1) f[1][j][k] = f[0][f[0][j][k]][1 - k];
                    else f[i][j][k] = f[i - 1][f[i - 1][j][k]][k];
                }
            }
        }
}

int dist(int a, int b)
{
    return abs(h[a] - h[b]);
}

void init_d()
{
    for (int i = 0; i < M; i ++ )
        for (int j = 1; j <= n; j ++ )
        {
            if (!i) 
            {
                da[0][j][0] = dist(j, ga[j]), da[0][j][1] = 0;
                db[0][j][1] = dist(j, gb[j]), db[0][j][0] = 0;
            }
            else
            {
                for (int k = 0; k < 2; k ++ )
                {
                    if (i == 1)
                    {
                        da[1][j][k] = da[0][j][k] + da[0][f[0][j][k]][1 - k];
                        db[1][j][k] = db[0][j][k] + db[0][f[0][j][k]][1 - k];
                    }
                    else
                    {
                        da[i][j][k] = da[i - 1][j][k] + da[i - 1][f[i - 1][j][k]][k];
                        db[i][j][k] = db[i - 1][j][k] + db[i - 1][f[i - 1][j][k]][k];
                    }
                }
            }
        }
}

void calc(int x, int s, int &la, int &lb)
{
    la = lb = 0;
    for (int i = M - 1; i >= 0; i -- )
    {
        if (f[i][s][0] && la + lb + da[i][s][0] + db[i][s][0] <= x)
        {
            la += da[i][s][0], lb += db[i][s][0];
            s = f[i][s][0];
        }
    }
}

int main()
{
    scanf("%d", &n);
    for (int i = 1; i <= n; i ++ ) scanf("%d", &h[i]);
    
    init_g();
    init_f();
    init_d();
    
    int s, x;
    scanf("%d", &x);
    int ans = 0, max_h = 0;
    double min_ratio = INF;
    for (int i = 1; i <= n; i ++ )
    {
        int la, lb;
        calc(x, i, la, lb);
        double ratio = lb ? 1.0 * la / lb : INF;
        if (ratio < min_ratio || ratio == min_ratio && max_h < h[i])
        {
            min_ratio = ratio;
            max_h = h[i];
            ans = i;
        }
    }
    
    printf("%d\n", ans);
    
    int m;scanf("%d", &m);
    while(m -- )
    {
        scanf("%d%d", &s, &x);
        int la, lb;
        calc(x, s, la, lb);
        printf("%d %d\n", la, lb);
    }
    
    return 0;
}

【例题】计算重复(AcWing294)

题目链接
思路:我们考虑这样一个问题,计算出 c o n n ( s 1 , n 1 ) conn(s1, n1) conn(s1,n1)生成的 c o n n ( s 2 , n 2 ) conn(s2, n2) conn(s2,n2)的数量 m ′ m' m′,那么原问题的解就是 m = m ′ / n 2 m = m' / n2 m=m′/n2。
同样是一个倍增的问题,可以通过预处理和二进制拼凑来求解。
首先预处理这样一个数组:
在这里插入图片描述
然后倍增过程也是比较简单滴

AC代码:

#include <iostream>
#include <algorithm>
#include <cstring>

using namespace std;

typedef long long LL;

const int N = 110, M = 31;

int n1, n2;
string s1, s2;
LL f[N][M];

void solve()
{
    int sz = s1.size();
    bool flag = false;
    for (int i = 0; i < sz; i ++ )
    {
        f[i][0] = 0;
        int p = i;
        for (int j = 0; j < s2.size(); j ++ )
        {
            int cnt = 0;
            while(s1[p] != s2[j])
            {
                p = (p + 1) % sz;
                cnt ++;
                if (cnt >= sz)
                {
                    flag = true;
                    break;
                }
            }
            p = (p + 1) % sz;
            f[i][0] += cnt + 1;
            if (flag) break;
        }
        if (flag) break;
    }
    if (flag)
    {
        cout << 0 << endl;
        return ;
    }
    
    for (int j = 1; j < M; j ++ )
        for (int i = 0; i < sz; i ++ )
            f[i][j] = f[i][j - 1] + f[(i + f[i][j - 1]) % sz][j - 1];

    LL ans = 0;
    for (int i = 0; i < sz; i ++ )
    {
        LL p = i, t = 0;
        for (int j = M - 1; j >= 0; j -- )
        {
            if (p + f[p % sz][j] <= sz * n1)
            {
                p += f[p % sz][j];
                t += 1 << j;
            }
        }
        ans = max(ans, t);
    }
    
    cout << ans / n2 << endl;
}

int main()
{
    while(cin >> s2 >> n2 >> s1 >> n1)
    {
        solve();
    }
    return 0;
}
CSAPP读书笔记与习题作业练习-第3章 CSAPP读书笔记与习题作业练习-第2章疑问疑问一习题整理定义与公式 疑问 疑问一 问题: 回答: 习题 整理 定义与公式 阅读详情

相关推荐

AM57x平台调试串口修改说明

AM57x平台开发板的默认调试串口为UART3,本例程以调试串口修改为UART1为例,演示修改AM57x平台调试串口的方法。 开发板型号 是否支持本实验 TL5728-EasyEVM 不支持 TL5728-IDK 支持 TL5728F-EVM 不支持 1修改U-boot源码 将光盘资料“U-Boot\U-Boot-2016.05\src”...

fdffvggg的博客 692

STM32 BootLoader 刷新项目 (十一) Flash写操作-命令0x57

STM32F407 芯片采用 Cortex-M4 内核,内置 Flash 存储用于程序和数据存储。扇区 0 到 3:16KB 每扇区扇区 4:64KB扇区 5 到 11:128KB 每扇区扇区编号起始地址大小00x0800000016 KB10x0800400016 KB20x0800800016 KB30x0800C00016 KB40x0801000064 KB5-110x08020000 开始每扇区128 KB分区结构。

艾格北峰嵌入式 2008

基于AM57x平台调试串口修改说明

AM57x平台开发板的默认调试串口为UART3,本例程以调试串口修改为UART1为例,演示修改AM57x平台调试串口的方法。(本文是基于创龙TL5728-IDK开发套件进行测试) 平台简介:AM5728是TI Sitara系列高性能SOC,得益于异构多核处理架构,CPU内集成了多核DSP、多核PRU、IVA-HD、GPU等协处理单元,通过硬件加速的方式极大增强CPU的数据、多媒体处理能力,可满足工...

Tronlong_的博客 1813

进制转换

在我们的日常生活中,充满着数字,首先我们都知道计算机底层都以二进制形式存在。那么我们怎么能知道一个数是二进制还是其他进制数呢?,接下来让我们了解各个进制如何表示和如何转换。本篇主要讲解四种进制的表示及其转换方法。 计算机中不同进制的使用说明: 对于整数,有四种表示方式; 1.二进制(binary):0,1, 满2进1,以0b或0B开头。 2.十进制(decimal):0-9, 满10进1; 3.八...

qq_22002457的博客 546

CH57X/CH58X系列BLE Mesh无线组网方案

BLE Mesh是蓝牙官方组织(SIG)推出的组网的规范,以BLE为载体,形成星型网状的多对多拓扑结构,网络中的每一台设备都可以与其它设备进行通信。CH57X/CH58X系列BLE Mesh无线组网方案已经全面支持蓝牙Mesh Profile的各项特性,包括转发、代理、朋友以及低功耗,并通过蓝牙技术联盟(Bluetooth SIG)官方认证以及阿里天猫精灵生态认证。可广泛用于智能家电、智能照明、智能楼宇、智能机器人、智能穿戴设备等领域。...

Cheryl13824368625 2404

CH57x蓝牙5.0开发实战:从机/主机模式与性能优化

蓝牙低功耗(BLE)技术作为物联网设备的核心通信协议,通过GATT协议实现设备间数据交互。其工作原理基于主从架构,主机(Central)主动扫描连接,从机(Peripheral)广播等待连接。CH57x系列芯片采用RISC-V架构,支持双模蓝牙5.0,在BLE模式下可实现100米通信距离与1.2mA低功耗。通过MTU协商机制可提升单包数据量至247字节,配合连接参数优化能实现8.7KB/s的传输速率。典型应用场景包括智能家居设备互联、传感器数据采集等需要低功耗无线通信的物联网领域。

weixin_33713350的博客 444

回顾进制的转换

二进制,八进制,十进制,十六进制的转换是作为程序员必须会的.其思想很简单,无外乎就是: 2进制遇2进1 8进制遇8进1 ... 二进制与十进制转换: 二进制11111111转换为十进制: 1 1 111 1 1 1 1 2 4816 32 64 128  =255 二进制10101010转换为十进制: 1 0 101 0 1 0 1 0 4

噬日者 2035

沁恒蓝牙芯片CH57x系列主从机配置差异解析与实践

本文深入解析了沁恒蓝牙芯片CH57x系列在开发中主从机配置的核心差异。通过对比主函数中GAPRole_PeripheralInit与GAPRole_CentralInit的关键调用,揭示了从“等待连接”到“主动连接”的角色逻辑转变,并详细阐述了共通的协议栈初始化、应用层任务搭建以及基于TMOS的事件驱动开发实践,为快速上手CH57x蓝牙应用开发提供清晰指南。

weixin_29168813的博客 130

倍增优化dp:

写在前面: 用倍增优化的动态规划算法求解问题时,一般分为两部分,第一部分是预处理,用阶段成倍增长的DP,计算出若干与2的整数次幂相关的代表状态。第二部分是拼凑,基于二进制拆分思想,用上一部分得到的代表状态组合成最终答案。 一、P1081 开车旅行: 题目描述 小 A 和小 B 决定利用假期外出旅行,他们将想去的城市从 1到 N 编号,且编号较小的城市在编号较大的城市的西边,已知各个城市的海拔高度互...

_Griefs 645

基于AM57x的OpenCV例程使用手册

1.OpenCV简介 OpenCV的全称是:Open Source Computer Vision Library,开源计算机视觉。OpenCV是一个基于BSD许可(开源)发行的跨平台计算机视觉库,可以运行在Linux、Windows、Android和Mac OS操作系统上。它轻量级而且高效——由一系列C函数和少量C++构成,同时提供了Python、Ruby、MATLAB等语言的接口,实现了图像处...

fdffvggg的博客 554

基于AM57x的RTOS SDK开发环境搭建和编译说明(2)

WindowsRTOSSDK开发环境搭建 在Windows下进行RTOS的开发,需要安装RTOS Processor-SDK-04.03版本对应的Windows版本CCS 7.4.0,并且工程文件的依赖关系较为复杂。 安装Windows版本RTOS Processor-SDK-04.03 双击光盘“Tools\Windows\ti-processor-sdk-rtos-am57xx-evm-04.03.00.05-Windows-x86-Install.exe”安装包,弹出Windows版...

Tronlong_的博客 547

加密之:用新的高级加密标准(AES)保持你的数据安全

加密之:用新的高级加密标准(AES)保持你的数据安全原著:James McCaffrey 翻译:小刀人  原文出处:MSDN Magazine November 2003 (Encrypt It)本文的代码下载:msdnmag200311AES.exe (143KB)本文假设你熟悉 C# 和 位(bit)操作。 摘要   AES(The Advanced Encryption Standard)是

2870

基于单片机直流电机调速控制系统设计

*单片机设计介绍,基于单片机直流电机调速控制系统设计。

2201_75940997的博客 2781

C语言典型例题57

判断整数是否为素数

2302_77517102的博客 935

全国30米分辨率逐年植被覆盖度(FVC)数据集

植被覆盖度是描述地表植被的重要参数与生态环境的基本指标,在大气圈、土壤圈、水圈和生物圈中都占据着重要的地位,区域及全球范围的植被覆盖度估算对植被及相关领域的研究具有重要意义。往往参照《土壤侵蚀分类分级标准》,将植被覆盖度划分为4个等级:<30%为低覆盖度、30%—45%为中低覆盖度、45%—60%为中覆盖度、>60%为高覆盖度。本数据集包括1986至2022年间,全国植被覆盖度数据,FVC范围值为0-1,数据为浮点型,GeoTIFF格式。NDVImax 和NDVImin分别为区域内最大和最小的NDVI值。

地球资源数据云的官方博客 1967

关于Win11安装Ubuntu子系统报错:WslRegisterDistribution failed with error 解决办法

Win11安装Ubuntu子系统报错:WslRegisterDistribution failed with error

qq_51908382的博客 3万+

基于AM57x的ARM与FPGA通信测试

通过ARM烧写SPI FLASH 表 1 开发板型号 是否支持本实验 TL570x-EVM 不支持 TL5728-EasyEVM 不支持 TL5728-IDK 不支持 TL5728F-EVM 支持 本实验在Linux系统下,由ARM通过SPI2总线烧写固化.bin文件到FPGA端的S...

Tronlong_的博客 754

【实战】——零代码玩转Supervisely人像分割:从标注到模型训练的数据流水线搭建

本文详细介绍了如何零代码使用Supervisely平台搭建人像分割数据流水线,从智能标注到数据集格式转换,再到模型训练与优化。Supervisely的智能标注工具和协作功能大幅提升了人像分割项目的效率,特别适合视频会议背景虚化、虚拟试衣等应用场景。

weixin_30694389的博客 416

A 57x57 app icon is required for iPhone apps targeting releases of iOS prior to 7.0

测试环境:Xcode6.1.1 警告:A 57x57 app icon is required for iPhone apps targeting releases of iOS prior to 7.0 解决方法:打开Images.xcassets文件夹,点击New APP Icon 然后你想要的东西就出现了 貌似,Xcode6.1.1默认的是不会

zhouxiangstudying的专栏 2576

LLC设计指南(一)第一章:别一上来就背公式,先把 LLC 的“脾气”摸清楚

很多工程师第一次学 LLC,都会有一种感觉:这个电源拓扑,好像不是在工作,而是在“跳舞”。Buck 很直观,开关一开,电感充电;开关一关,电感放电。Flyback 也好理解,先存能量,再把能量丢给副边。但 LLC 不一样。它不是硬邦邦地把能量“推过去”,而是让电感、电容、变压器一起形成一个谐振网络,让能量在里面来回摆动。控制器再通过调节开关频率,把这个摆动过程“驯服”成稳定输出。这也是 LLC 最迷人的地方:🎯。

weixin_43199439的博客 322

智能手表PCB布局:PPG与IMU传感器噪声隔离与应力解耦设计

在可穿戴设备硬件开发中,PCB布局已超越传统布线范畴,成为决定信号完整性、电磁兼容性与机械可靠性的核心环节。心率传感器(PPG)依赖微伏级光电容积脉搏波信号,极易受数字开关噪声与电源纹波干扰;姿态传感器(IMU)则对PCB弯曲形变引发的机械应力高度敏感。其布局需融合电磁场建模、热-力-电多物理协同及高密度互连约束。关键技术价值体现在噪声路径切断、地弹抑制、应力方向解耦与电源域隔离等工程实践。典型应用场景涵盖智能手表、医疗级贴片设备及微型运动传感终端。本文聚焦PPG与IMU两大模组在STM32L4平台上的实操

weixin_32869687的博客 174

0x57~0x59

目录 0x57~0x59 0x57 倍增优化DP 0x58 数据结构优化DP 0x59 单调队列优化DP 0x57~0x59 0x57 倍增优化DP a.[√] 开车旅行 题目传送 吐槽: 这道题是真的E心。。题面看了不知道多少遍吧,开始一直没看懂,...

weixin_30500289的博客 435

Modbus协议介绍及解析

Modbus协议介绍及解析 1.Modbus简介 Modbus是一种广泛应用于工业控制领域串行通信协议,以其开放性、高可靠性、高效简单性、免费等优点,成为了工业领域通信协议的业界标准,是工业现场电子设备之间常用的连接方式。Modbus按其格式可分为Modbus-RTU,Modbus-ASCII,Modbus-TCP,其中前两者适用于串行通信控制网络中,例如RS485,RS232等,而Modbus-TCP主要应用于基于以太网TCP/IP通信的控制网络中。通过此协议,控制器相互之间、或控制器和其它设备之间进行通

逍遥子的博客 1万+

CH582/ch579/ch573/ch57x 硬件设计

WCH低功耗蓝牙

BLE_Baby的博客 8295

卫星轨道坐标转换:轨道六根数到经纬高(经STK验证)

a:半长轴(km)e:偏心率i:轨道倾角(度)Ω:升交点赤经(度)ω:近地点幅角(度)ν:真近点角(度)

weixin_52370774的博客 170

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

终极指南:如何用ch57x-keyboard-tool完全掌控你的小型机械键盘

还在为那些只支持Windows、界面丑陋的原厂键盘编程软件而烦恼吗?今天我要介绍一个革命性的开源工具——ch57x-keyboard-tool,它专为那些小巧而强大的12键蓝牙键盘(带旋钮)设计,让你彻底摆脱原厂软件的束缚。这个跨平台工具不仅能一次性编程所有按键,还能解锁键盘的完整潜力,让你的工作效率和创造力得到质的飞跃。 ## 🚀 为什么选择ch57x-keyboard-tool? 如果你

gitblog_00802的博客 914

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

上一篇: 0x56 内容简介与例题习题
下一篇: 【区间dp】 [HNOI2010]合唱队
juruo_c
博客等级 码龄6年 520粉丝 116原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值