• 蓝桥杯之翻硬币(思维,找规律,贪心)


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

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

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

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

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

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

    Input

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

    Output

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

    Sample Input

    样例输入1
    **********
    o****o****
    
    样例输入2
    *o**o***o***
    *o***o**o***

    Sample Output

    样例输出1
    5
    
    样例输出2
    1

    Source

    蓝桥杯
     
     
    分析:
    先将目标态和初始态合并,相同赋0,不同赋1,这样就变成了一个二进制的字符串,我们的目的就是将所有的1变成0
    需要知道的是:
    1.1的数量肯定是偶数
    2.两个相邻的1翻转步数就是这两个1的间距(可以自己画图)
     
     
    所以最终的步数就是这些间距和的最小值!
    有种特殊情况
    比如1000110001
    如果先翻转中间的1,再翻转旁边的1,步数是10
    如果先翻转中间的一个1和旁边的1个1,步数是8
    所以对于这种情况我们应该按照第二种方式
     
    直接从头到尾的遍历这个二进制字符串,遇到一对1就是计算间距,最后输出间距和,就是答案
     
    code:
    #include<bits/stdc++.h>
    using namespace std;
    int main()
    {
        string str1,str2;
        int a[1005];
        cin>>str1;
        cin>>str2;
        for(int i=0;i<str1.length();i++)
        {
            if(str1[i]==str2[i])
                a[i]=0;
            else
                a[i]=1;
        }
        int cu=0;
        int flag=0;
        int sum=0;
        for(int i=0;i<str1.length();i++)
        {
            if(a[i]==0)
                continue;
            if(flag==0)
            {
                cu=i;
                flag=1;
            }else
            {
                sum+=i-cu;
                flag=0;
            }
        }
        cout<<sum<<endl;
        return 0;
    }
  • 相关阅读:
    Jenkins发布遇到的问题
    js相关问题总结
    代码洁癖症轻度患者-页面显示状态判断解决方案
    eclipse没有打断点,项目确仍然要进入断点的问题。
    liunx新装tomcat之后,tomcat不能识别新发布的项目
    phpstorm+xdebug单步调试的配置
    laravel 路由前缀,路由名称前缀区别
    Specified key was too long ... 767 bytes
    postman 自动化测试
    Linux top输出st 的值过高导致系统负载过高
  • 原文地址:https://www.cnblogs.com/yinbiao/p/10488643.html
Copyright © 2020-2023  润新知