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\n",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\n",flag++,sum+c);

85 }

86 return 0;

87 }

 

你可能感兴趣的:(bit)