买不到的数目

题目描述

小明开了一家糖果店。他别出心裁:把水果糖包成4颗一包和7颗一包的两种。糖果不能拆包卖。
小朋友来买糖的时候,他就用这两种包装来组合。当然有些糖果数目是无法组合出来的,比如要买 10 颗糖。
你可以用计算机测试一下,在这种包装情况下,最大不能买到的数量是17。大于17的任何数字都可以用4和7组合出来。
本题的要求就是在已知两个包装的数量时,求最大不能组合出的数字。

题解:

题目需要求a,b所不能组合的最大数字,该数字后面的所有数都能够被a,b组合得到。

假设该数字为c,c后面的数都能被a,b组合的条件就是c后的min{a, b}个数都能被组合。原因如下:

假设有a、b,且a < b

数字c是a、b不能组合的最大的数。且c+1、c+2、… … 、c+a都能被组合。

则可推出(c+a)+1 = (c+1)+a

(c+a)+2 = (c+2)+a

(c+a)+3 = (c+3)+a

… …

那么如何求c呢,易知当m可被组合时,m+a、m+b也可被组合,可以被组合的数字做上标记,遍历下去同时标记最后一个不能被组合的数,当其后面出现了min{a, b}个可以被组合的数时,该数就是所求的c。

代码:

public static void main(String[] args) {

    Scanner sc = new Scanner(System.in);
    int m = sc.nextInt();
    int n = sc.nextInt();

    int[] arr = new int[1000000];
    Arrays.fill(arr, 0);

    int min = Math.min(m, n);
    arr[m] = 1;
    arr[n] = 1;


    int index = 0;      // 标记最后一个不能被组合的数
    int num = 0;        // 记录arr[index]后连续可被组合数的个数

    for (int i = 0; i < 9999999; i++) {
        if (arr[i] == 0) {
            index = i;
            num = 0;
        } else {
            arr[i + m] = 1;
            arr[i + n] = 1;
            num++;
        }

        if (num >= min) {
            break;
        }
    }
    System.out.println(index);
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值