zoukankan      html  css  js  c++  java
  • 试题 历届试题 翻硬币(规律)

    问题描述

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

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

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

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

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

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

    输入格式

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

    输出格式

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

    样例输入1
    **********
    o****o****
    样例输出1
    5
    样例输入2
    *o**o***o***
    *o***o**o***
    样例输出2
    1
    思路
    只有偶数个不同翻转才可能实现到最终态,题目默认偶数了,最少的翻转的次数贪心依次从第一个不同的位置两两翻转就可以了,两两翻转就保证结果一定是偶数个不同,所以最后一个如果不同的话,前一个肯定也不同,翻转可得到最终态。如果最后一个相同的话,倒数第二个就是最后偶数个,也不需要翻转到最后一个。
    标记不同的位置,每次和下一个进行翻转即可。
    #include<bits/stdc++.h>
    using namespace std;
    int vis[1005];
    int main(){
        string a,b;
        cin>>a>>b;
        for(int i=0;i<a.size();i++){
            if(a[i]!=b[i]){
                vis[i]=1;
            }
        }
        int sum=0;
        for(int i=0;i<a.size();i++){
            if(!vis[i])continue;
            else if(vis[i]){
                sum++;
                vis[i]=0;
                if(vis[i+1])vis[i+1]=0;
                else vis[i+1]=1;
            }
        }
        cout<<sum<<endl;
        return 0;
    }

     

     
  • 相关阅读:
    EFCore数据库迁移命令
    EF基本操作
    EF执行存储过程
    [vue]element-ui使用
    [vue]vue-router的使用
    [vue]使用webpack打包
    [vue]插槽与自定义事件
    [vue]计算属性
    [vue]axios异步通信
    [vue]组件
  • 原文地址:https://www.cnblogs.com/mohari/p/13423947.html
Copyright © 2011-2022 走看看