zoukankan      html  css  js  c++  java
  • UVA12545_Bits Equalizer

    题目意思很简单,给你两个串,第一个串为0,1或者?,第二个串为0,1,

    每次你可以对第一个串进行三种操作,1、0变为1;2、?变为0或者1;3、交换任意两个数的位置。

    现在问你能否把第一个串变为第一个串?最少的步数是多少呢 ??

    其实关键抓住一点:0可以变1,1不能变0。

    然后剩下的就是简单的贪心了。

    #include <iostream>
    #include <cstring>
    #include <cstdio>
    #define maxn 122
    using namespace std;
    
    char s1[maxn],s2[maxn];
    int n,m,l,t,z1,z2,o1,o2,ans,cas=0,tep;
    
    int main()
    {
        scanf("%d",&t);
        while (t--)
        {
            scanf("%s",s1+1);
            scanf("%s",s2+1);
            printf("Case %d: ",++cas);
            l=strlen(s1+1);
            ans=o1=o2=z1=z2=0;
            for (int i=1; s1[i]; i++)
            {
                if (s1[i]=='1') z1++;
                if (s1[i]=='0') o1++;
                if (s2[i]=='1') z2++;
                if (s2[i]=='0') o2++;
            }
            if (z1>z2)
            {
                printf("-1
    ");
                continue;
            }
            for (int i=1; s1[i]; i++)
            {
                if (s1[i]=='?')
                {
                    if (s2[i]=='1' && z1<z2)
                    {
                        s1[i]='1';
                        z1++;
                        ans++;
                    }
                }
            }
            for (int i=1; s1[i]; i++)
            {
                if (s1[i]=='?')
                {
                    if (s2[i]=='0' && o1<o2)
                    {
                        s1[i]='0';
                        o1++;
                        ans++;
                    }
                }
            }
    
            for (int i=1; s1[i]; i++)
                if (s1[i]=='?')
                {
                    if (s2[i]=='1') s1[i]='0',o1++;
                    else s1[i]='1',z1++;
                    ans++;
                }
    
            for (int i=1; s1[i]; i++)
            {
                if (z1<z2 && s1[i]=='0' && s2[i]=='1')
                {
                    ans++;
                    s1[i]='1';
                    z1++,o1--;
                }
            }
    
            tep=0;
            for (int i=1; s1[i]; i++)
                if (s1[i]!=s2[i]) tep++;
            if (tep&1)
            {
                printf("-1
    ");
                continue;
            }
            ans+=(tep>>1);
            printf("%d
    ",ans);
        }
        return 0;
    }
    如有转载,请注明出处(http://www.cnblogs.com/lochan)
  • 相关阅读:
    设置ActiveMQ的访问密码
    Java NIO SocketChannel套接字通道
    Java 8 基础API的一些小的该进
    Java 8 异常该进
    Java NIO Channel to Channel Transfers通道传输接口
    Java NIO Scatter / Gather
    mysql分表经验总结
    Java 8 Optional类深度解析(转)
    Java 8 文件操作(转)
    使用 Java8 Optional 的正确姿势(转)
  • 原文地址:https://www.cnblogs.com/lochan/p/3439618.html
Copyright © 2011-2022 走看看