习题8-3 UVA - 12545 Bits Equalizer(贪心)

题意:

输入两个字符串,第一个字符串包括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);
			
			
			
		}
	}
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值