翻硬币
题目描述
核心思路
有 n n n个硬币,因为每次都是翻转相邻的两枚硬币,所以最多需要进行 n − 1 n-1 n−1次操作。
代码
#include<iostream>
using namespace std;
typedef long long LL;
LL ans; //最少翻硬币的次数
string st,ed; //起始状态,目标状态
//翻硬币操作
void turn(int i)
{
//如果当前u这个硬币是*正面朝上,则应该把u这个硬币翻转,使反面o朝上
if(st[i]=='*')
st[i]='o';
//否则说明当前u这个硬币是o反面朝上,则应该把u这个硬币翻转,使正面*朝上
else
st[i]='*';
}
int main()
{
cin >>st>>ed;
//只需要枚举到倒数第二枚硬币即可
for(int i=0;i<st.size()-1;i++)
{
//当起始状态的第i枚硬币与目标状态的第i枚硬币不相同时,则需要翻转
if(st[i]!=ed[i])
{
turn(i); //翻转当前i这枚硬币使得它与目标状态所对应的硬币相同
turn(i+1); //翻转当前i这枚硬币的下一枚硬币
ans++; //翻转次数+1
}
}
printf("%lld\n",ans);
return 0;
}