UVA 12545 Bits Equalizer

来源:互联网 发布:js验证提示信息 编辑:程序博客网 时间:2024/05/16 08:26
题目链接: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
Prev Submit Status Statistics Discuss Next
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 

 

301??000010100110110001000000

 

Sample Output 

 

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

 

Source

Western and Southwestern European Regionals, 2012 - Valencia
 
题目大意:将第一个字符与第二个字符每一个位置都相对应,至少需要移动的次数为多少。有以下的规则: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             else26                 c++;27         }28         for (int i=0; i<len1; i++)29         {30             if (t[i]=='0')31                 aa++;32             else33                 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 }

 

0 0
原创粉丝点击