您的位置:首页 > 其它

蓝桥杯:翻硬币(贪心)

2014-02-12 20:37 204 查看
  历届试题 翻硬币  

时间限制:1.0s   内存限制:256.0MB

问题描述

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

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

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

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

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

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

输入格式

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

输出格式

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

样例输入1

**********

o****o****

样例输出1

5

样例输入2

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

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

样例输出2

1

问题分析:

首先,我看到这个题目的时候,题目后面标记有(贪心)二字。找来本子,随便画了几个硬币翻转了几下。

当我画了下面这个图的时候:

* * o * *

* o * o *

我尝试着翻转了好几下都找不到正确结果。

同理(下面的也没结果):

* *                                   * * *            

o *                                  * o *

等等,这些应该都是没有结果的。

后来,题目我也不想做了。随便写了一段代码,提交后竟然给我了100分。

思路:

首先输入两行硬币,设为coins[0],coins[1],然后将这两行硬币按位匹配,当匹配到不同时就翻转。

比如:当搜索到第 i 个位置硬币不同,则将第 i 位和第 i+1 位翻转。

附录:(硬币翻转:贪心)

/*
Name: 蓝桥杯:翻硬币(贪心)
Copyright: 供交流
Author: Jopus
Date: 12/02/14 20:03
Description: dev-cpp 5.5.3
*/
/*
思想:遇到不同的硬币就翻转
*/
#include <stdio.h>
int main()
{
int i = 0, count = 0;
char coins[2][1000];
for (i = 0; i < 2; ++i)   //输入硬币
gets(coins[i]);
for (i = 0; coins[0][i] != '\0'; ++i)  //开始翻硬币
if (coins[0][i] != coins[1][i])
{
coins[0][i] = coins[1][i];
if (coins[0][i+1] == '*')      //翻转
coins[0][i+1] = 'o';
else
coins[0][i+1] = '*';
++count;
}
printf("%d",count);
return 0;
}
上面循环中if 中(i+1)明显有越界情况,算了,不考虑了。反正题目有问题。

提交序号姓名试题名称提交时间 


代码长度语言
C
C++
JAVA
评测结果
正确
错误
编译出错
运行错误
运行超时
内存超限
得分
100
1~99
0
CPU使用 


内存使用 


评测详情
67199Jopus翻硬币02-12 20:17502BC正确1000ms784.0KB评测详情

转载请保留原文地址:http://blog.csdn.net/jopus/article/details/19129375

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息