问题描述
小明正在玩一个“翻硬币”的游戏。
桌上放着排成一排的若干硬币。我们用 * 表示正面,用 o 表示反面(是小写字母,不是零)。
比如,可能情形是:**oo***oooo
如果同时翻转左边的两个硬币,则变为:oooo***oooo
现在小明的问题是:如果已知了初始状态和要达到的目标状态,每次只能同时翻转相邻的两个硬币,那么对特定的局面,最少要翻动多少次呢?
我们约定:把翻动相邻的两个硬币叫做一步操作,那么要求:
输入格式
两行等长的字符串,分别表示初始状态和要达到的目标状态。每行的长度<1000
输出格式
一个整数,表示最小操作步数。
样例输入1
**********
o****o****
o****o****
样例输出1
5
样例输入2
*o**o***o***
*o***o**o***
*o***o**o***
样例输出2
1
首先看题目觉得应该是道贪心,然后在纸上推了一遍,发现只要从头到尾扫一遍,o(n)的复杂度,遇到不同的就翻一次,这样得出的结果即是最少次数。
1 #include <iostream> 2 #include <stdio.h> 3 #include <string> 4 #include <string.h> 5 6 using namespace std; 7 8 string st,en; 9 int ans; 10 11 void solve() 12 { 13 ans = 0; 14 int len = st.length(); 15 for(int i = 0; i < len; i++) 16 { 17 if(st[i]!=en[i]) 18 { 19 ans++; 20 st[i] = st[i]=='*'?'o':'*'; 21 st[i+1] = st[i+1]=='*'?'o':'*'; 22 } 23 } 24 cout<<ans<<endl; 25 } 26 int main() 27 { 28 cin>>st>>en; 29 30 solve(); 31 32 return 0; 33 }