题意:
输入两个字符串,第一个字符串包括0,1,?, 第二个字符串只包括0和1,问由第一个字符串转换到第二个字符串最少多少个操作?
其中操作有3个,
1.可以把问号变成1或者0。
2.可以交换任意两个数字。
3.可以把0变成1.
思路:
仔细想想,可以得出,如果第一个字符串1的个数大于第二行的话,你怎样变都无法变过去。所以这种情况直接输出-1.
如果不是的话,那么你就统计0-1,和1-0的个数,取一个较大者加上问号就是答案!
为什么这样可以呢?
如果1-0多的话,并且第二个字符串1不少于第一个,那么?-1,1-1,0-1,肯定有不少。那么你1-0可以和?或者0进行交换,因为0和?换过来后可以直接变成想变的答案。
0-1多也是如此。
大致思路就是这样,可以在体会体会!
用java写的,感觉不写大数的话,麻烦了不少!
import java.util.Scanner;
import java.math.*;
public class Main {
public static void main(String[] args) {
Scanner cin = new Scanner(System.in);
int T = cin.nextInt();
for (int kase = 1; kase <= T; ++kase){
String u,v;
u = cin.next();
v = cin.next();
int len = u.length();
boolean ok = true;
int sum0 = 0,sum1 = 0;
for (int i = 0; i < len; ++i){
char ch1 = u.charAt(i);
char ch2 = v.charAt(i);
if (ch1 == '1')++sum0;
if (ch2 == '1')++sum1;
}
System.out.print("Case " + kase + ": ");
if (sum0 > sum1){
System.out.println("-1");
continue;
}
sum0 = 0;
sum1 = 0;
int sum = 0;
for (int i = 0; i < len; ++i){
char ch1 = u.charAt(i);
char ch2 = v.charAt(i);
if (ch1 == '0' && ch2 == '1')++sum0;
if (ch1 == '1' && ch2 == '0')++sum1;
if (ch1 == '?')++sum;
}
System.out.println(Math.max(sum0,sum1) + sum);
}
}
}