• 贪心 特殊密码锁


    a:特殊密码锁

    总时间限制: 
    1000ms
     
    内存限制: 
    1024kB
    描述

    有一种特殊的二进制密码锁,由n个相连的按钮组成(n<30),按钮有凹/凸两种状态,用手按按钮会改变其状态。

    然而让人头疼的是,当你按一个按钮时,跟它相邻的两个按钮状态也会反转。当然,如果你按的是最左或者最右边的按钮,该按钮只会影响到跟它相邻的一个按钮。

    当前密码锁状态已知,需要解决的问题是,你至少需要按多少次按钮,才能将密码锁转变为所期望的目标状态。

    输入
    两行,给出两个由0、1组成的等长字符串,表示当前/目标密码锁状态,其中0代表凹,1代表凸。
    输出
    至少需要进行的按按钮操作次数,如果无法实现转变,则输出impossible。
    样例输入
    011
    000
    样例输出
    1
    • 这个是齐齐问的一道好题,因为你很难想到这个题的做法就是贪心枚举,疑惑就是按不按第一个按钮
      #include <bits/stdc++.h>
      using namespace std;
      string s,gs;
      int a[34],b[34],n=0,f1=0,f2=0,c[34];
      int main() {
          cin>>s>>gs;
          for(int i=0; s[i]; i++)
              a[i+1]=s[i]-'0',b[i+1]=gs[i]-'0',c[i+1]=s[i]-'0',n++;
          for(int i=2; i<=n; i++)
              if(a[i-1]!=b[i-1]) {
                  a[i-1]^=1;
                  a[i]^=1;
                  a[i+1]^= 1;
                  ++f1;
              }
          int t1=1,t2=1;
          for(int i=1; i<=n; i++)
              if(a[i]!=b[i]) {
                  t1=0;
                  break;
              };
          c[1]^=1;
          c[2]^=1;
          ++f2;
          for(int i=2; i<=n; i++)
              if(c[i-1]!=b[i-1]) {
                  c[i-1]^= 1;
                  c[i]^= 1;
                  c[i+1]^=1;
                  ++f2;
              }
          for(int i=1; i<=n; i++)
              if(c[i]!=b[i]) {
                  t2=0;
                  break;
              }
          if(t1&&t2)return cout<<min(f1,f2)<<endl,0;
          if(t1) return cout<<f1<<endl,0;
          if(t2) return cout<<f2<<endl,0;
          cout<<"impossible"<<endl;
          return 0;
      }
  • 相关阅读:
    CSS 兼容性调试技巧
    CSS 常用的兼容性调试技巧
    全局CSS设置
    CSS 盒子模型
    CSS表格属性
    HTML引入CSS的方法
    CSS 定位
    CSS display overflow 属性 cursor光标类型
    CSS 继承和优先级
    沟通表达
  • 原文地址:https://www.cnblogs.com/BobHuang/p/7191791.html
Copyright © 2020-2023  润新知