【问题】将初始状态的硬币翻到目标状态最少需要翻动多少次?
【输入】
*o**o***o***
*o***o**o***
【输出】
1
【解题思路】
N个硬币一共有N-1种不同的翻转情况,而第一个和最后一个硬币想要改变状态只有一种情况,其他有两种,第一个硬币翻转后,其状态已经固定,可以无视,这时第二个硬币则可以当作第一个硬币来看待(递推的思想)所以本题则只需要遍历模拟,从前往后对初始状态和目标状态进行对比,遇到不同时计数器+1,再改变后面一个硬币的状态即可(后续遍历本硬币的状态对求出结果没有影响)。
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
int main()
{
string c1, c2;
cin >> c1;
cin >> c2;
int res = 0;
for (int i = 0; i < c1.size() - 1; i++)
{
if (c1[i] != c2[i])
{
res++;
if (c1[i+1] == 'o')
c1[i+1] = '*';
else
c1[i+1] = 'o';
}
}
cout << res << endl;
return 0;
}
本文探讨了如何通过最少的翻转操作将初始硬币序列调整到目标状态,利用递推思想和模拟算法,揭示了解决此类问题的关键。

被折叠的 条评论
为什么被折叠?



