第三届蓝桥杯省赛---翻硬币

时间限制:1.0s   内存限制:256.0MB
问题描述

小明正在玩一个“翻硬币”的游戏。

桌上放着排成一排的若干硬币。我们用 * 表示正面,用 o 表示反面(是小写字母,不是零)。

比如,可能情形是:

**oo***oooo

如果同时翻转左边的两个硬币,则变为:

oooo***oooo

现在小明的问题是:如果已知了初始状态和要达到的目标状态,每次只能同时翻转相邻的两个硬币,那么对特定的局面,最少要翻动多少次呢?

我们约定:把翻动相邻的两个硬币叫做一步操作,那么要求:

输入格式

两行等长的字符串,分别表示初始状态和要达到的目标状态。每行的长度<1000

输出格式

一个整数,表示最小操作步数。

样例输入1
**********
o****o****
样例输出1
5
样例输入2
*o**o***o***
*o***o**o***
样例输出2
1
 
分析:贪心题目,这道题目有一个隐藏条件,初始状态和目标状态不同之处肯定只有偶数处,不可能有奇数处,不然初始状态按照规则是不可能到达目标状态的。
 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<cstdlib>
 5 using namespace std;
 6 const int maxn = 1010;
 7 string s1;
 8 string s2;
 9 
10 int main(){
11     getline(cin,s1);
12     getline(cin,s2);
13     int len = s1.length();
14 
15     int ans=0;
16     for( int i=0; i<len; i++ ){
17         if(s1[i]!=s2[i]){
18             ans++;
19             if(s2[i]=='o'){
20                 s2[i]='*';
21             }
22             else{
23                 s2[i]='o';
24             }
25             if(s2[i+1]=='o'){
26                 s2[i+1]='*';
27             }
28             else{
29                 s2[i+1]='o';
30             }
31         }
32     }
33     cout<<ans<<endl;
34     return 0;
35 }
有些目标看似很遥远,但只要付出足够多的努力,这一切总有可能实现!
原文地址:https://www.cnblogs.com/Bravewtz/p/10431895.html