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\n");
            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\n");
            continue;
        }
        ans+=(tep>>1);
        printf("%d\n",ans);
    }
    return 0;
}

 

posted @ 2013-11-23 23:39  092000  阅读(509)  评论(0编辑  收藏  举报