0x01 内容总结与例题习题

0x01.基本算法 — 位运算 《算法竞赛进阶指南》学习笔记 阅读详情

《算法竞赛进阶指南》读书笔记汇总
这里面是我在阅读《算法竞赛进阶指南》这本书时的一些思考,有兴趣可以瞧瞧!
如若发现什么问题,可以通过评论或者私信作者提出。希望各位大佬不吝赐教!

内容总结与例题

二进制状态压缩

有一些问题经常可以采用二进制状态压缩起来成为一个容易解决的问题。
常用的操作有:
取出整数 n n n在二进制表示下的第 k k k位:(n >> k) & 1
把整数 n n n在二进制表示下的第 k k k位取反:n ^ (1 << k)
对整数 n n n在二进制表示下的第 k k k位赋值1:n | (1 << k)
对整数 n n n在二进制表示下的第 k k k位赋值0:n & (~(1 << k))

【例题】最短Hamilton路径(AcWing91)

题目链接
思路: 观察到 n n n的取值范围只有 ( n < = 20 ) (n <= 20) (n<=20),我们可以往暴力的方面想。由于每个点都只能经过一次,我们可以直接枚举点被经过的先后顺序,但时间复杂到高达 O ( n ∗ n ! ) O(n*n!) O(n∗n!)。其实这道题是属于状态压缩dp的,之后在更新0x56章节时会着重讲到。利用dp的思想,我们可以令 f [ i ] [ j ] f[i][j] f[i][j]表示点被经过的状态为 i i i,最后经过的点为 j j j时,所需的最短路径长度。那么可以得到以下转移方程:
f [ i ] [ j ] = m i n { f [ i x o r ( 1 < < j ) ] [ k ] + w e i g h t ( k , j ) } f[i][j] = min \{f[i xor (1 << j)][k] + weight(k,j)\} f[i][j]=min{f[ixor(1<<j)][k]+weight(k,j)},其中 0 < = k < n 0 <= k < n 0<=k<n并且 ( ( i > > j ) & 1 ) = = 1 ((i >> j) \& 1) == 1 ((i>>j)&1)==1
这个方程表示的是:对于当前节点 j j j,由于每个节点只能被恰好经过一次,那么之前一定没有别经过。那么当前状态 f [ i ] [ j ] f[i][j] f[i][j]就可以从“点被经过的状态中 j j j不存在”的状态 f [ i x o r ( 1 < < j ) ] [ k ] f[ixor(1 << j)][k] f[ixor(1<<j)][k]转移过来,加上 k k k到 j j j的距离就好啦

AC代码:

#include<bits/stdc++.h>
#define LL long long
#define INF 0x3f3f3f3f
#define N (1 << 20)

using namespace std;

int n;
int a[21][21];

int f[N][21];

void solve(){
    scanf("%d",&n);
    for(int i = 0;i < n;i ++)
        for(int j = 0;j < n;j ++)
            scanf("%d",&a[i][j]);


    memset(f,0x3f,sizeof(f));

    f[1][0] = 0;

    for(int i = 0;i < (1 <<n);i ++){
        for(int j = 0;j < n; j++){
            if(i & ( 1 << j )){
                for(int k = 0;k <n;k ++){
                    if((i ^ (1 << j)) & ( 1 << k )){
                        f[i][j] = min(f[i][j], f[(i ^ (1 << j))][k] + a[k][j]);
                    }
                }
            }
        }
    }

    printf("%d\n",f[(1 << n) - 1][n - 1]);
}

int main(){

    solve();
    return 0;
}

lowbit运算

l o w b i t ( n ) lowbit(n) lowbit(n)定义为非负整数 n n n在二进制表示下“最低位的1及其后边的所有的0”构成的数值。他被应用于树状数组中(在第0x42节会详细介绍)。
计算公式为: lowbig(n) = n & -n
自己推一推就知道什么意思了

习题

飞行员兄弟(AcWing116)

题目链接
思路: 观察到是一个 4 × 4 4×4 4×4的矩阵,那么我们直接枚举拨动开关的所有情况共 ( 1 < < 16 ) (1 << 16) (1<<16)种,对于每一个情况进行开关的变换,判断最终是否所有开关全部打开。若全部打开则更新最小答案。

AC代码:

#include<bits/stdc++.h>
#define N 1005

using namespace std;

char a[5][5];
int b[5][5],c[5][5];

void change(int x,int y){
    c[x][y] ^= 1;
    for(int i = 1;i <= 4;i ++){
        if(i != x) c[i][y] ^= 1;
        if(i != y) c[x][i] ^= 1;
    }
}

bool check(){
    for(int i = 1;i < 5;i ++)
        for(int j = 1;j < 5;j ++)
            if(c[i][j] == 0) return false;

    return true;
}

bool cmp(pair<int,int> a,pair<int,int> b){
    if(a.first == b.first)
        return a.second < b.second;
    return a.first < b.first;
}

void solve(){
    for(int i = 1;i <= 4;i ++)
        scanf("%s",a[i] + 1);

    for(int i = 1;i <= 4;i ++)
        for(int j =1;j <= 4;j ++)
            if(a[i][j] == '-')
                b[i][j] = 1;
            else b[i][j] = 0;

    int ans = 100;
    vector<pair<int,int> > anss;
    for(int i = 0;i < (1 << 16);i ++){
        memcpy(c,b,sizeof(b));
        int cnt = 0;
        vector<pair<int,int> > tmp;
        for(int j = 0;j < 16;j ++){
            if(i & ( 1 << j)){
                cnt ++;
                int x = j / 4,y = j % 4;
                change(x + 1,y + 1);
                tmp.push_back(make_pair(x + 1,y + 1));
            }
        }
        if(check() && cnt < ans){
            ans = cnt;
            anss = tmp;
        }
    }
    cout << ans << endl;
    sort(anss.begin(),anss.end(),cmp);
    for(auto x : anss)
        cout << x.first << " " << x.second << endl;

}

int main(){
    solve();
    return 0;
}

Modbus调试踩坑实录:从0x01到0x0B,手把手教你定位并修复9种常见通信故障 本文详细解析了Modbus通信中从0x01到0x0B的9种常见故障码,包括功能码错误、地址越界、数据边界问题等,并提供了实用的排查方法和修复技巧。通过真实案例和工具推荐,帮助工程师快速定位和解决Modbus通信故障,提升工业自动化系统的稳定性。 阅读详情

相关推荐

Modbus-RTU 协议 8 种常用功能码实战:从 0x01 到 0x10 的完整报文解析

本文深入解析Modbus-RTU协议的8种常用功能码,从0x01到0x10的完整报文结构,包括位操作、寄存器操作等核心功能。通过真实场景的十六进制案例和Python代码示例,帮助开发者快速掌握工业自动化通信的关键技术,提升设备交互效率。

weixin_30607659的博客 464

二进制压缩 - 算法

在编程时遇到每个数据只有两种状态,且 dfs 或者 bfs 时遍历时间复杂度高时,可以采用二进制压缩数据,尤其是二维数组。

用心编码 1万+

0x01位运算

它通过使用二进制位来表示不同的状态,并使用位运算来操作和检索这些状态。在二进制状态压缩中,每个状态被赋予一个唯一的二进制编码,称为状态掩码。例如,假设我们有一个集合 {A, B, C, D},其中每个元素可以处于两个可能的状态:存在或不存在。我们可以使用一个4位的二进制数来表示这四个元素的状态,其中每一位对应一个元素,0表示不存在,1表示存在。例如,0000表示所有元素都不存在,而1111表示所有元素都存在。通过使用位运算,我们可以高效地对这些状态进行操作。

louisdlee的博客 1942

0x56 内容简介与例题习题

状态压缩dp状压dp基本介绍【例题】蒙德里安的梦想(AcWing291)【例题】炮兵阵地(AcWing292)习题【练习】岛和桥(AcWing1194) 状压dp基本介绍 对于某些问题,我们需要在动态规划的“状态”中记录一个集合,保存“轮廓”的详细信息,以便进行状态转移。 通常,若所记录集合中的元素都是小于KKK的自然数,且集合大小不超过NNN,那么我们可以将这个集合表示成一个NNN位KKK进制数,用一个[0,KN−1][0,K^{N-1}][0,KN−1]范围内的十进制整数,作为状态中的某一维。这种把

juruo_c的博客 848

Modbus功能码0x01-0x04全解析:用C#搞定线圈状态读取与寄存器数值转换

本文深入解析了Modbus协议中最核心的0x01至0x04功能码,包括读线圈和读寄存器操作。通过C#实战代码,详细讲解了如何构建健壮的解析器,精准处理位状态读取、多字节数据转换以及应对工业现场常见的字节顺序问题,为开发工业自动化与物联网数据采集应用提供高效解决方案。

efc1234567的博客 830

C# ModbusRTU/ASCII/TCP功能码0x01-0x04数据解析实战:从字节顺序到数值转换的完整指南

本文深入解析了C#中处理ModbusRTU/ASCII/TCP协议数据的关键技术,重点攻克了功能码0x01-0x04数据解析中的字节顺序难题。通过实战代码演示了如何从原始字节流中提取有效数据,并针对不同设备(如Modicon PLC)的字节顺序(如3412、1234)进行精准的数值转换,提供了从框架搭建到问题排查的完整指南。

v6b7n8m9q0的博客 814

OBD服务简述1--0x01服务

因此,每辆车的ECU,其中至少支持一(1)个PID,应发送包含数据的PID的响应消息。这些PID包括是0x00,0x20,0x40,0x60,0x80,0xA0,0xC0,0xE0,SWS标准中称为。例如:PID 0x00表示0x01到 0x20之间的PID,PID 0x20表示0x21到0x40之间的PID。读取其中一个PID后ECU会返回4个字节的结果,这4个字节中的每个bit表示其所对应的PID是否被支持。下面介绍不同OBD服务的请求和响应数据格式(参考15031-5, 2015)

qq_40633122的博客 2401

C# Modbus通信从入门到精通(22)——Modbus TCP(0x01功能码与C#代码实现)

本文详细介绍了ModbusTCP协议中0x01读输出线圈功能码的原理、发送报文、返回报文,由高级工程师多年经验总结而成,绝对干货!

qq_34059233的博客 4488

单片机中0x00和0x01有什么区别

0x00=0,0x01=1,比如说P1=0x00,也就是给P1.0~P1.7端口赋低电平,P1=0x01,是P1.0为高电平,P1.1~P1.7为低电平. 这是十六进制的表示方法,转换成二进制分别是:0x00 = 0000 0000;0x01 = 0000 0001,也就是单片机P口的八位P1.7~P1.0从低位到高位输出的电平。 ...

u012602304的博客 4万+

ComfyUI实战:AnimateDiff与ControlNet结合,打造无缝风格化视频转绘

本文详细介绍了如何利用ComfyUI平台,结合AnimateDiff与ControlNet插件,实现高质量的视频风格化转绘。通过搭建节点工作流、调整关键参数,有效解决画面闪烁与失真问题,并分享了进阶玩法与常见问题解决方案,帮助用户轻松打造流畅、风格统一的动态视觉效果。

weixin_29039773的博客 341

深入浅出横向联邦学习、纵向联邦学习、联邦迁移学习

深入浅出解析横向联邦学习(Horizontal Federated Learning)、纵向联邦学习(Vertical Federated Learning)和联邦迁移学习(Federated Transfer Learning)有多个机构(比如几家不同的银行,或者几家医院)都拥有一些数据,他们希望联合起来训练一个更强大的机器学习模型,但出于隐私保护或法规要求,他们不能直接把数据共享出来。联邦学习就是为了解决这个问题而提出的。它的核心思想是“数据不动模型动”,即数据保留在本地,参与方共同训练模型。

frostmelody 全网同名,大家多多关注呀~ 持续分享优质内容! 2467

单源/多源/01BFS:模板与01BFS例题解析

本文介绍了三种基于广度优先搜索(BFS)的算法变体及其应用场景。单源BFS适用于边权为1的最短路径问题,多源BFS用于处理多个起点的最近距离计算,01-BFS则通过双端队列优化0/1边权图的最短路径搜索。文章还提供了算法模板和典型例题,如P1948电话线问题,展示了二分答案与01-BFS结合的解题思路。这些算法在迷宫搜索、连通性分析等场景中具有广泛的应用价值。

is_ko_nois_ko的博客 575

CPG控制网络入门

从线性变换开始推导

妖米的博客 5044

十六进制 0~f 对应 十进制 0~15 0x01就是1 0x0a就是10

十六进制 0~f 对应 十进制 0~15 0x01就是1 0x0a就是10

sifanlook的博客 1万+

2021-8-14 EDK II编译

2021-8-14 EDK II 编译为什么要写这篇文章新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出导入 为什么要写这篇文章 你好! 这是你第一次使用 Markdown编辑器 所展示的欢迎页。如果你想学习如何使用Markdo

qq_45775660的博客 2948

GD32F470 DSP库移植避坑指南:从CMSIS版本冲突到AC6工程配置

本文详细解析了在GD32F470平台上移植CMSIS-DSP库的完整流程与关键避坑点。针对CMSIS版本冲突、AC6编译器下的浮点ABI配置、DSP库源文件添加等核心难题,提供了经过验证的解决方案,帮助开发者高效完成移植,确保硬件FPU正常工作并优化性能。

data3的博客 531

0x01 位运算

习题AcWing216,P2114,例题P4310,K2192(最大and值),P8019 0x01 位运算 位运算和按位贪心是常用的计算和优化手段。其中,按位枚举可以将线性级别的枚举优化至 log⁡\loglog 级别;由于二进制的独特性质 20+21+⋯+2k−1<2k2^0+2^1+\cdots+2^{k-1}<2^k20+21+⋯+2k−1<2k,也让从高位到低位的按位贪心成为了可能。本文接下来将介绍一系列的位运算基本技巧,并结合例题分析位运算优化的运用。 位运算技巧 位运算的基本

Mars_Dingdang的博客 1586

基于物联网设计的蜂箱智能监测系统设计

为解决传统养蜂业依赖人工、管理效率低下、干扰蜂群等问题,本项目设计并实现了一套基于物联网(IoT)的蜂箱智能监测系统。

685

Modbus(功能码 0x01,0x02,0x03,0x04)发送与接收报文结构

1.线圈类 (0x01, 0x02):数据区是紧凑型的,8个状态挤在1个字节里按位传输。2.寄存器类 (0x03, 0x04):数据区是宽松型的,每个数据稳稳占用2个字节(高字节在前)。只要记住了“功能码定类型,字节数定长短,CRC收尾”这个心法,以后你在抓包调试 Modbus 通信时,一眼就能看穿那一串十六进制码到底在传达什么物理意义了!

qq_43089552的博客 610

OpenClaw 实战:7个真实场景的多 Agent 落地经验

《OpenClaw实战:7个真实场景的多Agent落地经验》摘要: 作者Maynor分享了从单Agent转向多Agent架构的实战经验。最初遇到的单Agent记忆混乱问题(如Flutter助手被C++话题干扰),通过拆分专项Agent(flutter-tutor/cpp-tutor等)并配置独立workspace解决。随后面临的技能调用混乱问题,采用"基础通用能力+专属能力"分层策略,通过Clawhub管理工具市场,将工具调用准确率从60%提升至95%。最后探讨多Agent协同方案,引入

Maynor的博客 1414

手把手教你学simulink(57.2)--电励磁同步电动机场景示例:基于Simulink的矢量控制(Field-Oriented Control, FOC)电励磁同步电动机

在某电动汽车驱动系统中,采用了本项目开发的带有矢量控制功能的电励磁同步电动机驱动系统,结合三相逆变器实现了对电动机的高效控制。在某工业驱动系统中,采用了本项目开发的带有矢量控制功能的电励磁同步电动机驱动系统,结合三相逆变器实现了对电动机的精确控制。经过实际测试,该系统的应用使得生产效率提高了10%,并且在高负载条件下,电动机的温升得到了有效控制,延长了电动机的使用寿命。通过本项目的实施,我们成功配置了三相交流电源、三相逆变器和电励磁同步电动机的参数,并实现了对电动机的精确控制。

MHD0815的博客 945

【01BFS】概念讲解 && 解法 && 例题讲解:P4554小明的游戏

01BFS” 是一种图遍历算法,常用于中找最短路径。你需要从起点出发,找到到所有点的最短路径。相比普通的 Dijkstra 算法,01BFS 更高效,在这种特殊图结构下能达到 线性时间复杂度 O(N + M),其中 N 是节点数,M 是边数。这个图的边的权重要么是 0,要么是 1。

2301_80361697的博客 1199

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

【UDS诊断】——0x34、0x36、0x37服务

Client端使用Routine Control服务来执行定义的步骤序列并获取特定序列的相关结果。该服务有极大的灵活性。Service31的典型用途可以包括擦除内存、重置定义的数据、覆盖正常服务控制策略以及控制ECU值随时间变化的功能。通过Service31可以启动特定序列、停止运行该特定序列、请求运行结果。该服务以往常用于ECU在做Software Update时,应用于检查刷写条件是否满足、传输数据完整性以及独立性检测。

LOVE135149的博客 6100

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

【STM32】SD在SPI模式下发送CMD0为什么会有响应(0x01)?(个人笔记)

为什么SD在SPI状态下发送CMD0会有响应啊?

qq978114的博客 887

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

PWMD01H = (level >> 8) & 0x01;PWMD0L = level & 0xFF

假设level的值为0x01FF0x01FF右移 8 位得到0x0001。0x0001与0x01按位与得到0x01。所以PWMD01H0x01。0x01FF与0xFF按位与得到0xFF。所以PWMD0L0xFF。这样,通过这两个操作,我们将 16 位的level分成了两个部分,高位的1被赋值给PWMD01H,低位的FF被赋值给PWMD0L。这是为了将 16 位的数据正确分配到两个 8 位寄存器中,从而正确地设置占空比。

m0_51103119的博客 283
上一篇: 树的直径
下一篇: 0x02 内容总结与例题习题
juruo_c
博客等级 码龄6年 520粉丝 116原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值