贪心 特殊密码锁

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;
    }

     

posted @ 2017-07-16 21:04  暴力都不会的蒟蒻  阅读(464)  评论(0编辑  收藏  举报