题目
桌上放着排成一排的若干硬币。我们用 *
表示正面,用 o
表示反面(是小写字母,不是零),比如可能情形是 **oo***oooo
,如果同时翻转左边的两个硬币,则变为 oooo***oooo
。现在小明的问题是:如果已知了初始状态和要达到的目标状态,每次只能同时翻转相邻的两个硬币,那么对特定的局面,最少要翻动多少次呢?
分析
因为只能连续翻两个,所以改变的情况可以两个两个的对照考虑,总共情况就是以下几种
分类分析可得,前两类只需要翻转一次即可,最后一种需要一直到下一次需要翻转的地方才能更改,由于题目说肯定有解,所以需要一直翻转,直到下一个不同的地方,例如样例1
将所有情况总结可得出规律,即两个不同花色之间差的和
代码
#include<bits/stdc++.h>
#define pb push_back
#define ll long long
#define guanliu ios::sync_with_stdio(0),cin.tie(0),cout.tie(0)
using namespace std;
const ll maxn=1e5+7;
const ll mod=1e9+7;
const ll INF=0x3f3f3f3f;
const double pi=acos(-1);
int main()
{
string s1,s2;
cin>>s1;
cin>>s2;
ll ans=0;
int j,k,f=0;
for(int i=0;i<s1.size();i++)
{
if(s1[i]!=s2[i]&&f==0)
{
j=i;
f=1;
continue;
}
if(s1[i]!=s2[i]&&f==1)
{
k=i;
int t=k-j;
ans+=t;
f=0;
}
}
cout<<ans<<endl;
return 0;
}