• 蓝桥杯训练 历届试题 翻硬币 (贪心找不同)


    问题描述

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

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

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

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

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

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

    输入格式

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

    输出格式

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

    样例输入1

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

    样例输出1

    5

    样例输入2

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

    样例输出2

    1

    比较两个字符串,相同为0不同为1做标记,然后,每遇到一对1的时候,就将他们的下标相减,加起来。最后就是答案。

    #include<iostream>
    #include<algorithm>
    #include<cstdio>
    #include<cstring>
    #include<string>
    using namespace std;
    
    int main()
    {
    	char a[10000+10],b[10000+10];
    	int c[10000+10];
    	int n,m,j,k,i,T,L,R;
    	gets(a);
    	gets(b);
    	int len = strlen(a);
    	for (i=0;i<len;i++)
    	{
    		if (a[i]==b[i])
    		c[i] = 0;
    		else
    		c[i] = 1;
    	}
    	/*for (i=0;i<len;i++)
    	cout<<c[i];
    	cout<<endl;*/
    	
    	int ans=0;
    	bool flag=0;
    	for (i=0;i<len;i++)
    	{
    		if (c[i]==1&&flag==0)
    		{
    			flag=1;
    			L = i;
    			continue;
    		}
    		if (c[i]==1&&flag==1)
    		{
    			ans+=(i-L);
    			flag=0;
    		}
    	}
    	cout<<ans<<endl;
    	return 0;
    }
    
    
  • 相关阅读:
    Codeforces 1184C1. Heidi and the Turing Test (Easy)题解
    CodeChef Chef and Digit Jumps 题解
    CodeChef Squirrel and chestnut 题解
    Atcoder Beginner Contest 082 C
    Atcoder Beginner Contest 081 C
    Atcoder Beginner Contest 080 C
    Atcoder Beginner Contest 079 C
    Atcoder Beginner Contest 078 C
    Topcoder 10524(SRM451 Div.1 C) BrickPuzzle题解
    广义表是非线性结构
  • 原文地址:https://www.cnblogs.com/Romantic-Chopin/p/12451116.html
Copyright © 2020-2023  润新知