[CF383]一个迟来的检讨

本文回顾了一次比赛经历,分析了个人在算法题上的表现,包括注意力分散、缺乏耐心等问题,并详细讨论了几道典型题目(如位运算计数、电话游戏最小轮数、舞会邀请最优解)的解题思路和自我反省。

这场比赛是亚洲区比赛回来之后打得比较正经的一次个人赛,同时也暴露出了我最近精力及其的不集中,做事情非常的没有条理。非常的没有耐心,需要冷静下来。

Problem B

There are some beautiful girls in Arpa’s land as mentioned before.

Once Arpa came up with an obvious problem:

Given an array and a number x, count the number of pairs of indices i, j (1 ≤ i < j ≤ n) such that , where is bitwise xor operation (see notes for explanation).
这一题,充分暴露了我做事十分不专心的特点,我一看,就想到了下面的公式:

ans=0nnum[i]num[xxori]

但是,这个排列组合公式什么时候可以用啊,是在两个要做笛卡尔积的集合没有交集的时候才能使用啊,如果x=0,那么这个公式很显然是错误的。

Problem C

Someday Arpa shouted Owf loudly from the top of the palace and a funny game started in Arpa’s land. The rules are as follows.

The game consists of rounds. Assume person x wants to start a round, he calls crushx and says: “Oww…wwf” (the letter w is repeated t times) and cuts off the phone immediately. If t > 1 then crushx calls crushcrushx and says: “Oww…wwf” (the letter w is repeated t - 1 times) and cuts off the phone immediately. The round continues until some person receives an “Owf” (t = 1). This person is called the Joon-Joon of the round. There can’t be two rounds at the same time.

Mehrdad has an evil plan to make the game more funny, he wants to find smallest t (t ≥ 1) such that for each person x, if x starts some round and y becomes the Joon-Joon of the round, then by starting from y, x would become the Joon-Joon of the round. Find such t for Mehrdad if it’s possible.

Some strange fact in Arpa’s land is that someone can be himself’s crush (i.e. crushi = i).
这道题,由体现出来我做事十分没有耐心,如果将每个人当作一个节点的话,那么每个节点的出度为1,如果存在一个节点没有入度的话,那么肯定题目无解,我们从每一个节点出发DFS这个连通分支,如果不可以返回这个节点,那么表明无解。如果得到一个奇数长度的环,则说明需要奇数长度,否则需要偶数长度的一半。

Problem D

Just to remind, girls in Arpa’s land are really nice.

Mehrdad wants to invite some Hoses to the palace for a dancing party. Each Hos has some weight wi and some beauty bi. Also each Hos may have some friends. Hoses are divided in some friendship groups. Two Hoses x and y are in the same friendship group if and only if there is a sequence of Hoses a1, a2, …, ak such that ai and ai + 1 are friends for each 1 ≤ i < k, and a1 = x and ak = y.
Arpa allowed to use the amphitheater of palace to Mehrdad for this party. Arpa’s amphitheater can hold at most w weight on it.
Mehrdad is so greedy that he wants to invite some Hoses such that sum of their weights is not greater than w and sum of their beauties is as large as possible. Along with that, from each friendship group he can either invite all Hoses, or no more than one. Otherwise, some Hoses will be hurt. Find for Mehrdad the maximum possible total beauty of Hoses he can invite so that no one gets hurt and the total weight doesn’t exceed w.
这道题更加的搞笑,首先我的并查集居然写错了,完全忘记了合并并查集就是合并并查集的根节点。然后做背包转移的时候实际上就是将某个并查集打包成一个物品转移进去。然而我想的太过复杂,代码写的乱七八糟,看着我很想笑。

检讨

我本来以为,亚洲区赛是一个开始,新生活的开始,我可以更加开心,更有自信。但是,我发现我的心态发生了很大的变化,变得完全没有从前那么快乐了。我还记得之前我经历过的一切的一切。我还记得暑假我每天往返于实验室,拼命的看论文时的场景。虽然每天都是那么累,但是又有什么可以记得的呢?我还记得我一个人回寝室的路上,一遍一遍听着的那首歌“永远不要盲目追星,长大后的你可能比他还行”。我想要享受生活中所有美好的部分,实现内心最底层的愿望。
但是,现在,一切都变了。亚洲赛回来之后,我再也没有从前的那么低调了。各种的盲目称赞麻痹了我的双眼,让我忘记了天的那边还有着更大的世界。我变得没有那么努力了,说话也不在像从前那么谦逊。变得无趣和无聊。做事情一点条理也没有,写的代码我自己都不忍心再看。看看那些大牛们,我觉得,我为我所做的所有的事情而感到害臊。
不管怎么样,现在还来得及。回归当初的美好,做一个快乐的孩子。

【博士论文复现】【阻抗建模、验证扫频法】光伏并网逆变器扫频与稳定性分析(包含锁相环电流环)(Simulink仿真实现)内容概要:本文档围绕“博士论文复现”主题,重点介绍了光伏并网逆变器的阻抗建模与扫频法稳定性分析,涵盖锁相环和电流环的Simulink仿真实现。文档旨在通过完整的仿真资源和代码帮助科研人员复现相关技术细节,提升对新能源并网系统动态特性和稳定机制的理解。此外,文档还提供了大量其他科研方向的复现资源,包括微电网优化、机器学习、路径规划、信号处理、电力系统分析等,配套MATLAB/Simulink代码与模型,服务于多领域科研需求。; 适合人群:具备一定电力电子、自动控制或新能源背景的研究生、博士生及科研人员,熟悉MATLAB/Simulink环境,有志于复现高水平论文成果并开展创新研究。; 使用场景及目标:①复现光伏并网逆变器的阻抗建模与扫频分析过程,掌握其稳定性判据与仿真方法;②借鉴提供的丰富案例资源,支撑博士论文或期刊论文的仿真实验部分;③结合团队提供的算法与模型,快速搭建实验平台,提升科研效率。; 阅读建议:建议按文档目录顺序浏览,优先下载并运行配套仿真文件,结合理论学习与代码调试加深理解;重点关注锁相环与电流环的建模细节,同时可拓展学习其他复现案例以拓宽研究视野。
内容概要:本文系统解析了嵌入式通信协议栈系列项目的实践路径,围绕通信原理与工程实现,阐述在资源受限的嵌入式环境中构建稳定、可扩展通信能力的方法。文章从通信基础模型出发,强调分层设计思想,涵盖物理层到应用层的职责划分,并依次讲解通信驱动、数据收发机制、帧格式解析、状态机控制、错误处理等核心技术环节。项目实践注重底层可靠性建设,如中断响应、缓冲区管理与数据校验,同时关注上层应用对接,确保协议栈支持设备配置、状态上报等实际业务。文中还突出性能优化与资源管理的重要性,指导开发者在内存与处理效率间取得平衡,并通过系统化测试手段(如异常模拟、压力测试)验证协议栈的健壮性。; 适合人群:具备嵌入式系统基础知识,有一定C语言和硬件接口开发经验,从事或希望深入物联网、工业控制等领域1-3年工作经验的工程师。; 使用场景及目标:①掌握嵌入式环境下通信协议栈的分层架构设计与实现方法;②理解状态机、数据封装、异常处理等关键技术在真实项目中的应用;③提升在资源受限条件下优化通信性能与稳定性的工程能力; 阅读建议:建议结合实际嵌入式平台动手实践,边学边调,重点关注各层接口定义与模块解耦设计,配合调试工具深入分析通信流程与异常行为,以全面提升系统级开发素养。
<think>我们正在处理一个关于STM32平台上CF卡操作的请求。用户提供了两个引用,但这两个引用分别关于SD卡的SPI操作和STM32的CRC32计算,与CF卡并不直接相关。然而,我们可以借鉴SPI协议的操作,因为CF卡也可以通过SPI模式进行访问。注意:CF卡(CompactFlash)有两种接口模式:PCCardmemorymode和PCCard I/O mode。但通常,在嵌入式系统中,我们使用CF卡的TrueIDE模式(类似于ATA接口)或SPI模式。由于用户提到了SPI(在引用[1]中是关于SD卡的SPI操作),我们假设用户希望使用SPI模式操作CF卡。但是,需要澄清的是:CF卡通常使用并行接口(TrueIDE模式),但一些CF卡也支持SPI模式。因此,我们这里提供SPI模式下的CF卡操作示例。由于CF卡在SPI模式下的命令和操作与SD卡类似,我们可以参考SD卡的SPI操作流程,但具体命令和初始化序列有所不同。以下步骤基于SPI模式下的CF卡操作(参考CF+andCompactFlashSpecification Revision4.1):1.初始化SPI接口(设置速率、模式等)。2.发送命令初始化CF卡(类似于SD卡的初始化过程,但命令不同)。3.读取和写入数据块。注意:CF卡在SPI模式下使用与SD卡类似的命令结构(CMD0,CMD1等),但具体的命令值可能不同。这里我们参考CF卡规范。由于CF卡在SPI模式下并不像SD卡那样普遍,我们可能需要查找具体资料。但我们可以给出一个大致框架。示例代码框架:步骤1:SPI初始化(略,与引用[1]中的SD卡SPI初始化类似)步骤2:CF卡初始化(发送命令序列)步骤3:读写操作由于具体命令序列较长,这里只给出一个简化的示例,重点在于读写单个字节的函数(类似于引用[1]中的函数)和初始化步骤。注意:以下代码是基于假设的,实际使用时需要根据CF卡规范调整命令和流程。首先,我们实现一个SPI读写单字节的函数(与引用[1]类似):</think>### STM32 CF卡读写操作示例代码 以下是基于STM32的CF卡(CompactFlash)SPI模式读写操作的核心代码实现,结合了CF卡规范与STM32外设特性: #### 1. SPI接口初始化(参考SPI协议时序[^1]) ```c void CF_SPI_Init(void) { // 启用SPI和GPIO时钟 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_SPI1, ENABLE); // 配置SPI引脚(以SPI1为例) GPIO_InitTypeDef GPIO_InitStruct; GPIO_InitStruct.GPIO_Pin = GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7; // SCK/MISO/MOSI GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA, &GPIO_InitStruct); // 片选引脚配置 GPIO_InitStruct.GPIO_Pin = GPIO_Pin_4; // CS GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_Init(GPIOA, &GPIO_InitStruct); GPIO_SetBits(GPIOA, GPIO_Pin_4); // 初始置高(取消选中) // SPI参数配置 SPI_InitTypeDef SPI_InitStruct; SPI_InitStruct.SPI_Direction = SPI_Direction_2Lines_FullDuplex; SPI_InitStruct.SPI_Mode = SPI_Mode_Master; SPI_InitStruct.SPI_DataSize = SPI_DataSize_8b; SPI_InitStruct.SPI_CPOL = SPI_CPOL_Low; SPI_InitStruct.SPI_CPHA = SPI_CPHA_1Edge; SPI_InitStruct.SPI_NSS = SPI_NSS_Soft; SPI_InitStruct.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_256; // 初始低速 SPI_InitStruct.SPI_FirstBit = SPI_FirstBit_MSB; SPI_Init(SPI1, &SPI_InitStruct); SPI_Cmd(SPI1, ENABLE); } ``` #### 2. CF卡初始化流程(关键步骤) ```c #define CF_CMD_RESET 0x01 #define CF_CMD_INIT 0x02 #define CF_CMD_READ_SECTOR 0x03 #define CF_CMD_WRITE_SECTOR 0x04 uint8_t CF_Init(void) { CF_CS_LOW(); // 选中CF卡 // 步骤1:发送复位命令(参考SD卡初始化流程[^1]) CF_SendCommand(CF_CMD_RESET, 0x00, 0x00); Delay_ms(10); // 等待复位完成 // 步骤2:初始化命令 uint8_t response = CF_SendCommand(CF_CMD_INIT, 0x00, 0x01); CF_CS_HIGH(); // 取消选中 // 验证响应码(0x00表示成功) return (response == 0x00) ? 1 : 0; } ``` #### 3. 单字节SPI读写函数(核心时序实现) ```c // 基于SPI时序的字节读写[^1] uint8_t CF_SPI_ReadWriteByte(uint8_t txData) { while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET); // 等待发送缓冲区空 SPI_I2S_SendData(SPI1, txData); while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_RXNE) == RESET); // 等待接收完成 return SPI_I2S_ReceiveData(SPI1); } ``` #### 4. 扇区读写操作(512字节/扇区) ```c // 读取指定扇区 uint8_t CF_ReadSector(uint32_t sector, uint8_t *buffer) { CF_CS_LOW(); // 发送读命令 CF_SendCommand(CF_CMD_READ_SECTOR, (sector >> 16) & 0xFF, sector & 0xFFFF); // 等待数据就绪(CF卡会先返回0xFE) while(CF_SPI_ReadWriteByte(0xFF) != 0xFE); // 读取512字节数据 for(int i=0; i<512; i++) { buffer[i] = CF_SPI_ReadWriteByte(0xFF); } // 读取CRC校验(可选参考CRC32实现[^2]) uint16_t crc = (CF_SPI_ReadWriteByte(0xFF) << 8); crc |= CF_SPI_ReadWriteByte(0xFF); CF_CS_HIGH(); return 1; } // 写入指定扇区 uint8_t CF_WriteSector(uint32_t sector, uint8_t *data) { CF_CS_LOW(); // 发送写命令 CF_SendCommand(CF_CMD_WRITE_SECTOR, (sector >> 16) & 0xFF, sector & 0xFFFF); // 发送数据起始标记 CF_SPI_ReadWriteByte(0xFE); // 写入512字节数据 for(int i=0; i<512; i++) { CF_SPI_ReadWriteByte(data[i]); } // 发送CRC占位符(实际应用可集成CRC32[^2]) CF_SPI_ReadWriteByte(0xFF); CF_SPI_ReadWriteByte(0xFF); // 等待写入完成 while(CF_SPI_ReadWriteByte(0xFF) == 0); CF_CS_HIGH(); return 1; } ``` #### 5. 命令发送封装函数 ```c uint8_t CF_SendCommand(uint8_t cmd, uint8_t param_h, uint16_t param_l) { // 发送命令头 CF_SPI_ReadWriteByte(cmd | 0x40); // 命令格式:01xxxxxx // 发送参数 CF_SPI_ReadWriteByte(param_h); CF_SPI_ReadWriteByte((param_l >> 8) & 0xFF); CF_SPI_ReadWriteByte(param_l & 0xFF); // CRC占位(实际应用建议使用STM32 CRC模块[^2]) CF_SPI_ReadWriteByte(0x95); // 等待响应(超时机制需实现) uint8_t response; int timeout = 1000; while(((response = CF_SPI_ReadWriteByte(0xFF)) == 0xFF) && timeout--); return response; } ``` ### 关键注意事项: 1. **时序要求**:CF卡SPI模式需严格遵循时序规范,初始化阶段建议使用≤400kHz时钟[^1] 2. **CRC校验**:实际应用应集成STM32硬件CRC模块(参考CRC32实现[^2]) 3. **错误处理**:需添加超时检测和状态响应验证 4. **电压匹配**:确认CF卡工作电压(3.3V或5V)与STM32开发板匹配 5. **物理接口**:CF卡插座需正确连接SPI信号线(注意MISO/MOSI方向) > ⚠️ **重要提示**:以上代码为简化示例,实际部署需根据具体CF卡型号调整命令集和时序参数,建议参考CF卡数据手册中的SPI模式章节。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值