硬币反转

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

问题描述

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

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

比如,可能情形是:**oo***oooo

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

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

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

输入格式

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

输出格式

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

样例输入1

**********

o****o****

样例输出1

5

样例输入2

*o**o***o***

*o***o**o***

样例输出2

1

思路:这道题其实隐藏了一个条件,初始状态和目标状态不同之处肯定只有偶数处,不可能有奇数处,不然初始状态到达不了目标状态,把初始状态和目标之处的相同之处标记为0不同之处标记为1。先举一个例子1011001,是先翻中间的2个1呢还是一次翻呢,先翻中间2个1,总共的次数是6次,一次翻总共是5次,其实只要依次翻就是最少的,自己可以画一下,总的次数就是依次2个1的下标之差的总和

AC代码:

[cpp]view plaincopyprint?

1. #include

2. #include

3. #include

4. #include

5. #include

6. #include

7. #include

8. #include

9. #include

10. #include

11. #include

12.

13. typedef long long ll;

14. using namespace std;

15.

16. char a[1010];

17. char b[1010];

18.

19. int main()

20. {

21. int i;

22. while(scanf("%s%s",a,b) != EOF)

23. {

24. int n = strlen(a);

25. int sum = 0,k;

26. bool flag = true;

27. for(i=0; i

28. {

29. if(a[i] != b[i])

30. {

31. if(flag)

32. {

33. k = i;

34. flag = false;

35. }

36. else

37. {

38. sum += i - k;

39. flag = true;

40. }

41. }

42. }

43. printf("%d\n",sum);

44. }

45. return 0;

46. }

•蓝桥杯算法训练2的次幂表示

•蓝桥杯历届试题核桃的数量(求三个数的最小公倍数)

相关文档
最新文档