[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.
这道题更加的搞笑,首先我的并查集居然写错了,完全忘记了合并并查集就是合并并查集的根节点。然后做背包转移的时候实际上就是将某个并查集打包成一个物品转移进去。然而我想的太过复杂,代码写的乱七八糟,看着我很想笑。

检讨

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

根据原作 https://pan.quark.cn/s/459657bcfd45 的源码改编 Classic-ML-Methods-Algo 引言 建立这个项目,是为了梳理和总结传统机器学习(Machine Learning)方法(methods)或者算法(algo),和各位同仁相互学习交流. 现在的深度学习本质上来自于传统的神经网络模型,很大程度上是传统机器学习的延续,同时也在不少时候需要结合传统方法来实现. 任何机器学习方法基本的流程结构都是通用的;使用的评价方法也基本通用;使用的一些数学知识也是通用的. 本文在梳理传统机器学习方法算法的同时也会顺便补充这些流程,数学上的知识以供参考. 机器学习 机器学习是人工智能(Artificial Intelligence)的一个分支,也是实现人工智能最重要的手段.区别于传统的基于规则(rule-based)的算法,机器学习可以从数据中获取知识,从而实现规定的任务[Ian Goodfellow and Yoshua Bengio and Aaron Courville的Deep Learning].这些知识可以分为四种: 总结(summarization) 预测(prediction) 估计(estimation) 假想验证(hypothesis testing) 机器学习主要关心的是预测[Varian在Big Data : New Tricks for Econometrics],预测的可以是连续性的输出变量,分类,聚类或者物品之间的有趣关联. 机器学习分类 根据数据配置(setting,是否有标签,可以是连续的也可以是离散的)和任务目标,我们可以将机器学习方法分为四种: 无监督(unsupervised) 训练数据没有给定...
<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模式章节。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值