[编程题] 01翻转

牛牛正在挑战一款名为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);
                }
            }
        }
    }



}
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值