uva12545 Bits Equalizer

uva12545 Bits Equalizer

You are given two non-empty strings S and T of equal lengths. S contains the characters `0', `1' and `?', whereas T contains `0' and `1' only. Your task is to convert S into T in minimum number of moves. In each move, you can

  1. change a `0' in S to `1'
  2. change a `?' in S to `0' or `1'
  3. swap any two characters in S

As an example, suppose S = "01??00" and T = "001010". We can transform S into T in 3 moves:

  • Initially S = "01??00"
  • - Move 1: change S[2] to `1'. S becomes "011?00"
  • - Move 2: change S[3] to `0'. S becomes "011000"
  • - Move 3: swap S[1] with S[4]. S becomes "001010"
  • S is now equal to T

Input 

The first line of input is an integer C (C$ \le$200) that indicates the number of test cases. Each case consists of two lines. The first line is the string S consisting of `0', `1' and `?'. The second line is the string T consisting of `0' and `1'. The lengths of the strings won't be larger than 100.

 Output 

For each case, output the case number first followed by the minimum number of moves required to convert S into T. If the transition is impossible,output `-1' instead.

 Sample Input 

3
01??00
001010
01
10
110001
000000

 Sample Output 

 

Case 1: 3
Case 2: 1
Case 3: -1

 

这个题目用到的是统计的思想,不用真正的去变字符串里字符的位置,只需要统计哪几个要变动就OK。

 

#include <algorithm>
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
const int MAXN = 255;
int num[4];
char S[MAXN], T[MAXN];
int solve(int len)
{
    memset(num, 0, sizeof(num));
    for(int i = 0; i < len; ++i)
    {
        if(S[i] == '0' && T[i] == '1' ) num[0]++;
        else if(S[i] == '1' && T[i] == '0') num[1]++;
        else if(S[i] == '?' && T[i] == '1') num[2]++;
        else if(S[i] == '?' && T[i] == '0') num[3]++;
    }

    int ans = min(num[0], num[1]);
    if(num[0] >= num[1])
    {
        num[0] -= ans;
        if(num[3] - num[0] >= 0)
        {
            ans += 2*num[0];
            ans += num[2]  + num[3] - num[0];
        }
        else
        {
            ans += 2*num[3];
            ans += num[2] + num[0] - num[3];
        }
    }
    else if(num[0] < num[1])
    {
        num[1] -= ans;
        if(num[2] - num[1] >= 0)
        {
            ans += 2*num[1];
            ans += num[3] + num[2] - num[1];
        }
    }
    return ans;
}
int main()
{
    int Tcase, ans;
    int tag1, tag2;

    scanf("%d%*c", &Tcase);
    for(int t = 1; t <= Tcase; ++t)
    {
        tag1 = 0, tag2 = 0;
        ans = 0;
        gets(S);
        gets(T);
        int len = strlen(S);

        for(int i = 0; i < len; ++i)
        {
            if(S[i] == '1')   tag1++;
            if(T[i] == '1')   tag2++;
        }
        if(tag1 > tag2 )
            printf("Case %d: %d\n", t, -1);
        else
        {
            printf("Case %d: %d\n", t, solve(len));
        }
    }
    return 0;
}

 

 

 


posted @ 2015-07-25 11:03  unicoe  阅读(245)  评论(0编辑  收藏  举报