「已注销」 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 关于#Java#的问题,如何解决?
  • ¥15 加热介质是液体,换热器壳侧导热系数和总的导热系数怎么算
  • ¥15 想问一下树莓派接上显示屏后出现如图所示画面,是什么问题导致的
  • ¥100 嵌入式系统基于PIC16F882和热敏电阻的数字温度计
  • ¥15 cmd cl 0x000007b
  • ¥20 BAPI_PR_CHANGE how to add account assignment information for service line
  • ¥500 火焰左右视图、视差(基于双目相机)
  • ¥100 set_link_state
  • ¥15 虚幻5 UE美术毛发渲染
  • ¥15 CVRP 图论 物流运输优化