题目:
1208. 翻硬币 - AcWing题库
思路:
1.对于要求从A变化到B的这类题,可以采用开关控制的方法。
2.一次翻转连续两个硬币,求origin变为result 最少需要翻转多少次。我们在origin的两个硬币中间放一个开关,开关变换则开关两侧的两个硬币都翻转。可以从第一个硬币的位置开始,若origin[0]和result[0]不相同则变换一次origin[0]与origin[1]之间的开关(相同则不动开关),从而确保origin[0]和result[0]相等,依次类推,由origin两硬币间的开关确保控制origin左边的硬币正反面与result对应位置的正反面相同。(这里默认最后一个硬币正反面一定相同,否则无解)
3.需要从origin[0]遍历到origin[n-1],时间复杂度为O(n)。
代码:
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<string>
using namespace std;int i, ans = 0;//记录有多少个开关发生了变换(每个开关只会变换一次)
string origin, result;void turn(int x) //翻转函数
{if (origin[x] == '*')origin[x] = 'o';else origin[x] = '*';
}int main()
{cin >> origin >> result;for (i = 0; i < origin.size()-1; i++) {if (origin[i] != result[i]) {turn(i); turn(i + 1);ans++;}}cout << ans;
}