牛牛正在挑战一款名为01翻转的游戏。游戏初始有A个0,B个1,牛牛的目标就是把所有的值都变为1,每次操作牛牛可以任意选择恰好K个数字,并将这K个数字的值进行翻转(0变为1,1变为0)。牛牛如果使用最少的操作次数完成这个游戏就可以获得奖品,牛牛想知道最少的操作次数是多少?
例如:A = 4 B = 0 K = 3
0000 -> 1110 -> 1001 -> 0100 -> 1111
需要的最少操作次数为4
输入描述:
输入为一行:
一共三个整数A(0 ≤ A ≤ 100,000),B(0 ≤ B ≤ 100,000),K(1 ≤ K ≤100,000).以空格分隔
输出描述:
输出一个整数,表示最少需要的操作次数。如果不能完成,则输出-1
输入例子:
4 0 3
输出例子:
4
import java.util.*;
public class Main {
private static int minStep = Integer.MAX_VALUE;
private static Set<Integer> set = new HashSet<>();//防止进入重复状态
public static void main(String[] args){
Scanner scanner = new Scanner(System.in);
int num0 = scanner.nextInt();
int num1 = scanner.nextInt();
int k = scanner.nextInt();
fanzhuan(num1,num0,k,0);
if (minStep == Integer.MAX_VALUE){
System.out.println("-1");
}else {
System.out.println(minStep);
}
}
private static void fanzhuan(int num1,int num0,int k,int step){
if (num0 == 0) {
minStep = Math.min(step,minStep);
set.remove(num0);
return;
}
if (num0 < 0 | num1 < 0){
set.remove(num0);
return;
}
set.add(num0);
if (num0>=k){
fanzhuan(num1+k,num0-k,k,++step);
}else {
for (int i = 1; i <= Math.min(k, num0); i++) {//反转i个0 k-i个1
int new1 = num1 + 2 * i - k;
int new0 = num0 + k - 2 * i;
if (!set.contains(new0)) {
fanzhuan(new1, new0, k, ++step);
}
}
}
}
}