原题链接:蓝桥杯历届试题-翻硬币
解题思路: 这题解法很多,可以枚举也就是宽带的收索(利用队列)但是这一题也存在着规律,接下来让我们来看看要如何发现。
步骤1:先用已给例子进行推敲
其实蓝桥被原题给了两个例子
第一个: **********
o****o****
输出:5
规律:其实就是从第一个不同开始我们就开始翻,一直翻到下一个不同。如何我们可以试试两个不同之间差的个数:0个,奇数个。
当我们考虑完这些情况发现,无论中间是隔着0个,偶数个,奇数个的情况,只要我们连着翻,就是这一段的最小次数。
那么全部次数,我们也就可以分割成这样一段一段计算啦
其实问题解决思路就是先解决这个问题的小规模数据,如何用你解决的方法在数据变化时看适用吗?需要如何变化。
注意事项:
1. 必须连着翻动,不如你中间原本一样的会变为不一样。
2. 那么有没有可能出现两段字符串有奇数个不同呢?
一想就知道肯定不行,因为我们一次翻动的个数是两个,就是你一次翻动就会改变这个串两个字符,那么无聊你怎么翻,都是偶次数的改变。
参考代码:
#include<iostream> using namespace std; int main(){ string s1; string s2; getline(cin,s1); getline(cin,s2); int n = s1.length(); int ans = 0; int start = -1; for(int i=0;i<n;i++){ if(s1[i]!=s2[i]){ //发现不同 if(start==-1){ //判断是不是“新的起点”,因为有多段 start=i; } else //第二次发现,证明这是新起点后的第一个不同点 { ans+=(i-start); start=-1; // 还原,为了发泄下一个”起点“做准备 } } } cout<<ans; return 0; }
0.0分
2 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复