zoukankan      html  css  js  c++  java
  • 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
    ", t, -1);
            else
            {
                printf("Case %d: %d
    ", t, solve(len));
            }
        }
        return 0;
    }

  • 相关阅读:
    【基础知识】文件的读写操作
    【基础知识】winfrom窗体的属性
    【基础知识】ASP.NET[基础一(ashx)]
    【基础知识】Dom基础
    【基础知识】JavaScript基础
    【基础知识】C#数据库中主键类型的选择
    【基础知识】ASP.NET[基础二(aspx)]
    fileUpload上传文件,并设置文件名以及保存服务器位置
    list转成json,json转成list
    一个checkbox 用jquery实现全选、全不选
  • 原文地址:https://www.cnblogs.com/ya-cpp/p/4675502.html
Copyright © 2011-2022 走看看