「已注销」 2023-02-26 15:16 采纳率: 100%
浏览 19
已结题

关于#贪心#的问题,如何解决?

白菜按钮只有两种状态1与0,蠢萌蠢萌的ljw想把一串白菜按钮变成目标状态。 但是ljw体态圆润,按一个按钮就会不小心碰到旁边两个。 已知如果某个白菜按钮被按下,就会改变状态,求ljw最少的操作次数。

输入格式
两行,给出两个由0、1组成的等长字符串(长度不超过5*10^6),表示当前和目标状态。

输出格式
至少需要进行的按按钮操作次数,如果无法实现转变,则输出impossible。

  • 写回答

1条回答 默认 最新

  • _L.Y.H._ 2023-02-26 15:21
    关注
    
    #include<bits/stdc++.h>
    using namespace std;
    char a[5000005],b[5000005];
    int main()
    {
        scanf("%s%s",a+1,b+1);
        int len=strlen(a+1);
        for(int i=1;i<=len;i++)
        {
            if(a[i]==b[i])a[i]=b[i]=0;
            else a[i]=b[i]=1;
        }
        if(len==1)
        {
            if(a[1]==0)printf("0\n");else printf("1\n");
            return 0;
        }
        if(len==2)
        {
            if(a[1]!=a[2])printf("impossible\n");
            else if(a[1]==a[2])
            {
                if(a[1]==0)printf("0\n");else printf("1\n");
            }
            return 0;
        }
        int n1=1,n2=0;
        a[1]^=1;a[2]^=1;
        for(int i=1;i<=len-1;i++)
        {
            if(a[i]==1){a[i]^=1;a[i+1]^=1;a[i+2]^=1;n1++;}
            if(b[i]==1){b[i]^=1;b[i+1]^=1;b[i+2]^=1;n2++;}
        }
        if(a[len]==1)n1=999999999;
        if(b[len]==1)n2=999999999;
        int ans=min(n1,n2);
        if(ans==999999999)printf("impossible\n");
        else printf("%d\n",ans);
        return 0;
    }
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 2月26日
  • 已采纳回答 2月26日
  • 创建了问题 2月26日

悬赏问题

  • ¥15 使用ue5插件narrative时如何切换关卡也保存叙事任务记录
  • ¥20 软件测试决策法疑问求解答
  • ¥15 win11 23H2删除推荐的项目,支持注册表等
  • ¥15 matlab 用yalmip搭建模型,cplex求解,线性化处理的方法
  • ¥15 qt6.6.3 基于百度云的语音识别 不会改
  • ¥15 关于#目标检测#的问题:大概就是类似后台自动检测某下架商品的库存,在他监测到该商品上架并且可以购买的瞬间点击立即购买下单
  • ¥15 神经网络怎么把隐含层变量融合到损失函数中?
  • ¥15 lingo18勾选global solver求解使用的算法
  • ¥15 全部备份安卓app数据包括密码,可以复制到另一手机上运行
  • ¥20 测距传感器数据手册i2c