2013 蓝桥杯 省赛B组 翻硬币(洛谷P8597题) 从暴力BFS到贪心算法的优化之路

贾蔷
• 阅读 16

一、问题背景与理解

洛谷P8597是一道经典的翻硬币问题,题目描述如下:给定两个由''和'o'组成的字符串s1和s2,分别表示初始状态和目标状态。每次操作可以选择任意位置开始翻转连续的k个硬币(''变'o','o'变'*')。要求计算出从初始状态变为目标状态所需的最少操作次数。

这个问题看似简单,但蕴含着重要的算法思想转变过程。作为新手,理解这个问题从暴力解法到最优解法的演进过程,对培养算法思维非常有帮助。

2013 蓝桥杯 省赛B组 翻硬币(洛谷P8597题) 从暴力BFS到贪心算法的优化之路

二、暴力BFS解法分析

int minOperations(string s, int k) {
    int n = s.length();
    int target = stoi(s, nullptr, 2); // 字符串转二进制数
    queue<int> q; // BFS队列
    vector<bool> visited(1<<n, false); // 状态访问标记

    q.push(0); // 初始全0状态
    visited[0] = true;
    int steps = 0;

    while (!q.empty()) {
        int size = q.size();
        while (size--) {
            int curr = q.front();
            q.pop();
            if (curr == target) return steps;

            for (int i=0; i<=n-k; ++i) {
                int mask = (1<<k)-1 << i;
                int next = curr ^ mask;

                if (!visited[next]) {
                    visited[next] = true;
                    q.push(next);
                }
            }
        }
        steps++;
    }
    return -1;
}

三、贪心算法优化

#include <iostream>
#include <string>
using namespace std;

int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);

    string s1, s2;
    cin >> s1 >> s2;
    int cnt = 0;

    for (int i = 0; i < s1.size() - 1; ++i) {
        if (s1[i] != s2[i]) {
            // 翻转当前和下一个硬币
            s2[i] = s1[i];
            s2[i+1] = (s2[i+1] == 'o') ? '*' : 'o';
            cnt++;
        }
    }
    cout << cnt;
    return 0;
}

​原文:蓝桥杯 2013 省B 洛谷P8597题翻硬币 从暴力BFS到贪心算法的优化之路

点赞
收藏
评论区
推荐文章
Wesley13 Wesley13
3年前
java nio(nio机制buffer及buffer优化)
深入Buffer:下面,我们看下NIO中buffer的两个重要的组成部分:buffer的状态变量和buffer的访问方法;状态变量是buffer内部计数系统的关键,在每一次的read/write过程中,buffer的状态变量都是变化的。通过记录和跟踪这些状态变化,buffer就可以在内部完成操作资源的控制;当你从channel中读
Kubrnete Kubrnete
4年前
基于活动选择问题的贪心算法
目录问题描述:(问题描述%3A)输入格式(输入格式)输出格式(输出格式)算法描述(算法描述与分析)算法分析(算法分析)算法图示(图解)问题描述:Coda从0时刻开始观看直播,到t时刻结束。一共有n场直播可被选择,已知所有直播场次的起止时间和主播名称,其中第i场直播从ai时刻开始,
Stella981 Stella981
3年前
LeetCode
零钱兑换给定不同面额的硬币coins和一个总金额amount。编写一个函数来计算可以凑成总金额所需的最少的硬币个数。如果没有任何一种硬币组合能组成总金额,返回 \1。示例 1:输入:coins\1,2,5\,amount11输出:3解释:11551示例2:输入:coi
Wesley13 Wesley13
3年前
ES6(六)数值的扩展
二进制和八进制表示法ES6提供了二进制和八进制数值的新的写法,分别用前缀0b(或0B)(二进制binary)和0o(或0O)(八进制octonary)表示。0b111110111503//true0o767503//true从ES5开始,在严格模式之中,八进制就不再允许使用前缀0表示,E
Wesley13 Wesley13
3年前
mysql查询每个学生的各科成绩,以及总分和平均分
今天看一个mysql教程,看到一个例子,感觉里面的解决方案不是很合理。问题如下:有学生表:!在这里插入图片描述(https://oscimg.oschina.net/oscnet/07b001b0c6cb7e0038a9299e768fc00a0d3.png)成绩表:!在这里插入图片描述(https://oscimg.o
菜园前端 菜园前端
1年前
什么是贪心算法?
原文链接:什么是贪心算法?贪心算法是算法设计的一种方法。期盼通过每个阶段的局部最优选择,从而达到全局的最优。但结果不一定是最优的。基础案例场景一零钱兑换现有硬币1元、2元、5元,需要用最少的硬币数量凑够11元。利用贪心算法实现,优先考虑最好的结果就是面值为
贾蔷 贾蔷
1天前
蓝桥杯2023接龙数列(洛谷P9242)题解:动态规划与数字首尾匹配的完美应用
一、题目解读这道蓝桥杯省赛真题要求找出数字序列中最长的接龙子序列(每个数字的首位等于前一个数字的末位),并计算需要删除的最少数字个数。题目考察动态规划的实际应用能力,是理解数字特征处理和状态转移的典型案例。二、解题步骤1.处理n1的特殊边界情况2.读取输入
贾蔷 贾蔷
1天前
洛谷P1255题 解题思路和步骤 C++实现带注释,c++入门基础题
一、问题描述与递推关系建立洛谷P1255数楼梯问题要求计算n级台阶的不同走法数,每次可以跨1级或2级。这本质上是斐波那契数列的变种问题,递推公式为f(n)f(n1)f(n2)。当n≤50时可用普通整型存储,但题目中n可能达到5000,这就必须使用高精度运
贾蔷 贾蔷
1天前
2025年GESP七级等价消除(洛谷P11965)代码解析与优化策略
一、题目解读2025年GESP七级考试中的“等价消除(洛谷P11965)”问题要求统计给定字符串中满足等价条件的子串数量。所谓“等价子串”,是指子串中所有字符出现的次数均相同。题目需要高效算法解决,考验对字符串处理和状态压缩的掌握。二、解题思路采用位运算