zoukankan      html  css  js  c++  java
  • UVA 12545 Bits Equalizer

    题目链接:http://www.bnuoj.com/bnuoj/problem_show.php?pid=27865

    Bits Equalizer

    1000ms
    131072KB
     
    This problem will be judged on UVA. Original ID: 12545
    64-bit integer IO format: %lld      Java class name: Main
    Font Size:  
    Type:  

    [PDF Link]

    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 convertS 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
    

    Source

     
    题目大意:将第一个字符与第二个字符每一个位置都相对应,至少需要移动的次数为多少。有以下的规则:1、0可以变成1;2、?可以变成0 or 1;3、任意0与1的位置可以互换
     
    解题思路:统一0和1以及?的个数,因为?一定要变换,所以最少移动次数也得有?个数次,所以在其基础上加就可以了。
    分两种情况考虑:(交换、变换)
    优先变换情况:
    1、存在1/0,并且后面可以找到0/1,那么交换。
    2、存在1/0,但是找不到与其对应的0/1可以交换,那么就只能选择?/1,那么交换。
    变换情况:
    1、存在0/1,这种情况的话就直接把0变换成1即可。
     
    综上,只要把所有情况考虑到,AC就不再是梦想啦,哇哈哈~~
     
    详见代码。
     1 #include <iostream>
     2 #include <cstdio>
     3 #include <cstring>
     4 
     5 using namespace std;
     6 
     7 int main ()
     8 {
     9     int n,len1,flag=1;
    10     char s[110],t[110];
    11     scanf("%d",&n);
    12     while (n--)
    13     {
    14         scanf("%s%s",s,t);
    15         len1=strlen(s);
    16         //len2=strlen(t);
    17         int a,b,c,aa,bb;
    18         a=b=c=aa=bb=0;
    19         for (int i=0; i<len1; i++)
    20         {
    21             if (s[i]=='0')
    22                 a++;
    23             else if (s[i]=='1')
    24                 b++;
    25             else
    26                 c++;
    27         }
    28         for (int i=0; i<len1; i++)
    29         {
    30             if (t[i]=='0')
    31                 aa++;
    32             else
    33                 bb++;
    34         }
    35         if (b>bb)
    36         {
    37             printf ("Case %d: -1
    ",flag++);
    38             continue;
    39         }
    40         int sum=0;
    41         int j;
    42         if (s[i]=='1'&&t[i]=='0')
    43         {
    44             for (j=0; j<len1; j++)
    45             {
    46                 if (s[j]=='0'&&t[j]=='1')
    47                 {
    48                     sum++;
    49                     s[i]='0';
    50                     s[j]='1';
    51                     break;
    52                 }
    53             }
    54             if (j>=len1)
    55                 break;
    56 
    57         }
    58     }
    59     for (int i=0; i<len1; i++)
    60     {
    61         int j;
    62         if (s[i]=='1'&&t[i]=='0')
    63         {
    64             for (j=0; j<len1; j++)
    65             {
    66                 if (s[j]=='?'&&t[j]=='1')
    67                 {
    68                     sum++;
    69                     s[i]='?';
    70                     s[j]='1';
    71                     break;
    72                 }
    73             }
    74             if (j>=len1)
    75                 break;
    76         }
    77     }
    78     for (int i=0; i<len1; i++)
    79     {
    80         if (s[i]=='0'&&t[i]=='1')
    81             sum++;
    82         //ans=sum+c;
    83     }
    84     printf ("Case %d: %d
    ",flag++,sum+c);
    85 }
    86 return 0;
    87 }
  • 相关阅读:
    MD5消息摘要算法的那些事
    关系数据库设计范式介绍(第一范式,第二范式,第三范式)
    C# string byte数组转换解析
    c#中FTP上传下载
    CString/string 区别及其转化
    伟大的神器 pjax 在thinkphp中的应用
    js jquery 判断当前窗口的激活点
    widget 传参数问题
    常见适用的函数
    thinkphp 分页函数
  • 原文地址:https://www.cnblogs.com/qq-star/p/4674056.html
Copyright © 2011-2022 走看看