【无标题】

给定一个正整数X和一个最大值M,要求分为多组,组数不限

给定一个正整数X和一个最大值M,要求分为多组,组数不限
规则:
1.每组的最大值不能超过M
2.每组的最小值大于或等于1000
3.每组相加之和为X,
4.每组都是整数

首先尝试保持所有分组≤M
如果不可能,则允许最后一个分组>M,但必须≥1000

public static List<Integer> splitX(int X, int M) {
        List<Integer> groups = new ArrayList<>();

        if (X < 1000) {
            // 无法满足条件,因为每组至少为1000
            return groups;
        }

        int k = X / M;
        int r = X % M;

        if (r == 0) {
            // 完全由M组成
            for (int i = 0; i < k; i++) {
                groups.add(M);
            }
        } else if (r >= 1000) {
            // 可以添加余数r作为一个组
            for (int i = 0; i < k; i++) {
                groups.add(M);
            }
            groups.add(r);
        } else {
            // 余数r < 1000,需要调整
            if (M >= 2000 - r) {
                // 可以从一个M中借出部分给r
                for (int i = 0; i < k - 1; i++) {
                    groups.add(M);
                }
                groups.add(M + r - 1000);
                groups.add(1000);
            } else {
                // 无法调整,允许最后一个组 > M
                int kPrime = (X - 1000) / M;
                int R = X - kPrime * M;
                for (int i = 0; i < kPrime; i++) {
                    groups.add(M);
                }
                groups.add(R);
            }
        }

        return groups;
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值