华为OD真题--分月饼--带答案

news/2024/7/20 17:48:20 标签: 华为od, java, 后端

1. 华为OD机考题 + 答案

2023华为OD统一考试(A+B卷)题库清单-带答案(持续更新)

2023年华为OD真题机考题库大全-带答案(持续更新)

2. 面试题

一手真实java面试题:2023年各大公司java面试真题汇总--持续更新

3. 技术知识

java后端技术汇总 + 中间件 + 架构思想

题目描述:

公司分月饼,m个员工,买了n个月饼,m <= n,每个员工至少分一个月饼,但是也可以分到多个,单人分到最多月饼的个数是Max1,单人分到第二多月饼个数是Max2。

但需要满足Max1-Max2 <= 3,单人分到第n-1多月饼个数是Max(n-1),单人分到第n多月饼个数是Max(n), 想要满足Max(n-1) - Max(n) <= 3,问有多少种分月饼的方法?

输入描述:

每一行输入m,n,表示m个员工,n个月饼,m <=n

输出描述:

输出有多少种分法

示例1:

输入

2 4

输出

2

说明

4=1+3

4=2+2

注意:1+3和3+1要算成同一种分法

示例2:

输入

3 5

输出

2

说明

5=1+1+3

5=1+2+3

示例3:

输入

3 12

输出

6

说明

满足要求的6种分法:

1、12 = 1 + 1 + 10 (Max1=10, Max2=1,不满足Max1-Max2 <= 3的约束)

2、12 = 1 + 2 + 9 (Max1=9,Max2=2,不满足Max1-Max2 <= 3的约束)

3、12 = 1 + 3 + 8 (Max1=8,Max2=3,不满足Max1-Max2 <= 3的约束)

4、12 = 1 + 4 + 7 (Max1=7,Max2=4,Max3=1, 满足要求)

5、12 = 1 + 5 + 6 (Max1=6,Max2=5,Max3=1, 不满足要求)

6、12 = 2 + 2 + 8 (Max1=8,Max2=2,不满足要求)

7、12 = 2 + 3 + 7 (Max1=7,Max2=3,不满足要求)

8、12 = 2 + 4 + 6 (Max1=6,Max2=4,Max3=2, 满足要求)

9、12 = 2 + 5 + 5 (Max1=5,Max2=2 满足要求)

10、12 = 3 + 3 + 6 (Max1=6,Max2=3 满足要求)

11、12 = 3 + 4 + 5 (Max1=5,Max2=4,Max3=3 满足要求)

12 = 4 + 4 + 4 (Max1=4,满足要求)

public class DivideMooncake {
//非最优解,需要考虑减枝,减少遍历次数。
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int [] num = Arrays.stream(scanner.nextLine().split(" ")).mapToInt(Integer::parseInt).toArray();
        //分配人数
        int peoples = num[0];
        //待分配数量
        int dnum = num[1] - num[0];
        //重新分配后每个人月饼数量
        int [] nums = new int[peoples];
        // 用一个List来存储所有分配方案
        List<List<Integer>> result = new ArrayList<>();
        divide(dnum,peoples,nums,result);
        List<List<Integer>>filteredResult = removeDuplicate(result);

        //System.out.println(filteredResult);
        System.out.println(filteredResult.size());
    }

    public static void divide(int num,int peolpe, int [] nums,List<List<Integer>> result){
        if (peolpe == 1){
            nums[0] = num;
            List<Integer> allocation = new ArrayList<>();
            for (int i : nums){
                allocation.add(i);
            }
            result.add(allocation);
            return;
        }

        for (int i = 0; i <= num ; i++){
            //要分配的月饼
            nums[peolpe - 1] = i;
            //递归调用,将要分配的月饼分配给其它人
            divide(num - i,peolpe -1,nums,result);
        }

    }

    /**
     * 判断是否满足条件  Max(n) - Max(n-1) >= 3
     * @param nums
     * @return
     */
    public static Boolean satisfy(List<Integer> nums){
        int i = nums.size() -1;
        while (i >= 1){
            if (nums.get(i) - nums.get(i - 1) > 3){
                return false;
            }
            i--;
        }
        return true;
    }


    /**
     * 分数一致的去重
     * @param result
     * @return
     */
    public static List<List<Integer>> removeDuplicate(List<List<Integer>> result) {
        List<List<Integer>> filteredResult = new ArrayList<>();

        for (List<Integer> allocation : result) {
            boolean duplicate = false;
            allocation.sort(Integer::compareTo); // 对分配方案进行排序

            for (List<Integer> existingAllocation : filteredResult) {
                existingAllocation.sort(Integer::compareTo); // 对已有的分配方案进行排序

                if (Arrays.equals(existingAllocation.toArray(), allocation.toArray())) {
                    duplicate = true; // 分配方案重复
                    break;
                }
            }

            if (!duplicate) {
                if (satisfy(allocation)){
                    filteredResult.add(allocation);
                }
            }
        }

        return filteredResult;
    }

}


http://www.niftyadmin.cn/n/4950927.html

相关文章

unity 之 Vector 数据类型

文章目录 Vector 1Vector 2Vector 3Vector 4 Vector 1 在Unity中&#xff0c;Vector1 并不是一个常见的向量类型。 如果您需要表示标量&#xff08;单个值&#xff09;或者只需要一维的数据&#xff0c;通常会直接使用浮点数&#xff08;float&#xff09;或整数&#xff08;in…

【推荐】深入浅出bean的生命周期

目录 1.spring 管理JavaBean的过程&#xff08;生命周期&#xff09; 2.spring的JavaBean管理中单例模式及原型&#xff08;多例&#xff09;模式 2.1 . 默认为单例&#xff0c;但是可以配置多例 2.2.举例论证 2.2.1 默认单例 2.2.2 设置多例 2.2.3单例与多例的初始化的时…

所有用户都能使用sudo吗

是的&#xff0c;Linux系统中的普通用户可以通过配置访问 sudo 命令来获得超级用户&#xff08;root&#xff09;权限的临时访问权。这使得普通用户可以在需要时执行需要管理员权限的操作&#xff0c;而无需永久性地切换到超级用户账户。 通过 sudo 命令&#xff0c;系统管理员…

文件和目录的基础操作

cat命令 concatenate(连接)的缩写&#xff0c;即 combine pieces together 1&#xff09;把碎片组合在一起&#xff08;意味着可以使用cat创建一个小文件&#xff09; 2&#xff09;显示文件 ──(root㉿kali)-[~] └─# cat /etc/resolv.conf # Generated by NetworkManager…

python通过S7协议读取西门子200smart数据

发现网上很多关于python通过s7协议控制200smart的代码都失败&#xff0c;我猜应该是版本的问题。自己捣鼓了半天&#xff0c;终于测试成功 from snap7 import util,clientmy_plc client.Client() #建立一个客户端对象 my_plc.set_connection_type(3) #如果是200smart,必须有此…

opencv实战项目-停车位计数

手势识别系列文章目录 手势识别是一种人机交互技术&#xff0c;通过识别人的手势动作&#xff0c;从而实现对计算机、智能手机、智能电视等设备的操作和控制。 1. opencv实现手部追踪&#xff08;定位手部关键点&#xff09; 2.opencv实战项目 实现手势跟踪并返回位置信息&a…

流弊的docker

docker就是隔离式运行软件组&#xff08;多个软件&#xff09;&#xff0c;docker分为dockerfile文件&#xff0c;images 镜像&#xff0c;容器&#xff0c;本地仓库&#xff0c;远程仓库。 构建dockerFile文件&#xff0c;可以获得images镜像 运行镜像获得容器 || 容器提交获得…

飞天使-docker简单命令操作

文章目录 进入容器查看实时日志宿主机和容器之间文件交互导出容器镜像或者离线镜像dockerfile参数说明演示案例 将现有的镜像进行打包生成新的镜像数据库时区修改的三种方式两个容器公用一个本机目录三个容器公用一个volume 容器日志处理docker-compose下载compose 文件结构与版…