原题链接:蓝桥杯历届试题-翻硬币
解题思路: 这题解法很多,可以枚举也就是宽带的收索(利用队列)但是这一题也存在着规律,接下来让我们来看看要如何发现。
步骤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、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复