蓝桥杯【历届试题 翻硬币】 java版 (贪心算法)

                                                       历届试题 翻硬币  

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

   

问题描述

 

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

 

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

 

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

 

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

 

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

 

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

输入格式

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

输出格式

 

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

样例输入1

**********

o****o****

样例输出1

5

样例输入2

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

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

样例输出2

1

 

import java.util.Scanner;

/**
 * 翻硬币 贪心算法
 * @author Sylvia
 * 2019年3月6日
 */
public class Main{
	
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		String start = sc.nextLine();
		String end = sc.nextLine();
		sc.close();
		
		//转换成数组形式
		String[] sta = start.split("");
		String[] en = end.split("");
		//判断前面是否已经有不一样的硬币
		boolean isDiff = false;
		//上一个不同硬币的位置
		int temp = 0;
		//需要翻转的最小操作步数
		int min = 0;
		
		for(int i = 0; i < sta.length; i++) {
			if(!sta[i].equals(en[i])) {
				if(!isDiff) {
					temp = i;
					isDiff = true;
				}else {
					//相距最近的两个不同硬币之间需要翻转的次数为 它们下标之差
					min += i - temp;
					isDiff = false;
				}
			}
		}
		System.out.println(min);
	}
}

猜你喜欢

转载自blog.csdn.net/Sylvia_17/article/details/88218704