当前位置: 首页 > article >正文

算法之物品移动

算法之

目录

  • 1. 题目
  • 2. 解释
  • 3. 思路
  • 4. 代码
  • 5. 总结

1. 题目

n个打包机器从左到右一字排开,上方有一个自动装置会抓取一批放物品到每个打包机上,放到每个机器上的这些物品数量有多有少,由于物品数量不相同,需要工人 将每个机器上的物品进行移动从而到达物品数量相等才能打包。每个物品重量太大、 每次只能搬一个物品进行移动,为了省力,只在相邻的机器上移动请计算在搬动最小轮数的前提下,使每个机器上的物品数量相等。如果不能使每个机器上的物品相同, 返回﹣1。
例如[1,0,5]表示有3个机器,每个机器上分别有1、0、5个物品,经过这些轮后:
第一轮:1 0 <-5 => 114 第二轮:1<-1<-4 =>2 1 3 第三轮:2 1<-3=>2 2 2移动了3轮,每个机器上的物品相等,所以返回3
例如[2,2,3]表示有3个机器,每个机器上分别有2、2、3个物品,这些物品不管怎么移动,都不能使三个机器上物品数量相等,返回﹣1。

2. 解释

就是说,让物品在相邻的打包机器之间移动,但是每次只能移动一个,不过可以同时多个进行移动。

3. 思路

我们进行移动,肯定是有一个方向的,不能一个往左,一个往右,这样相当于没有移动。假设以当前的这个机器为节点,它的左右进行移动。
有三种情况:

  1. 当前的机器上的包裹少,两边都多,那么,包裹就会向当前机器上流动。当前情况下,移动的次数是包裹最多的一侧向当前机器移动的次数。另一侧的移动会跟这一侧的移动同时进行。
  2. 当前机器包裹多,两边都少,那么包裹会从当前机器向两边移动。当前情况下,因为包裹只能移动一个,所以移动次数是两侧差多少包裹的和
  3. 一侧包裹多,一侧包裹少,包裹从一侧移向另一侧。这时,移动次数等于,少的一侧缺少的数量与多的一侧多的数量的最大值。

我们接下来进行循环,计算每一个位置的移动次数,求最少。

4. 代码

public class Code02_PackingMachine {
    public static int MinOps(int[] arr){
        if(arr == null || arr.length == 0){
            return 0;
        }
        int size = arr.length;
        int sum = 0;
        for(int i = 0; i < size; i++){
            sum += arr[i];
        }
        if(sum % size != 0){
            return -1;
        }
        int avg = sum / size;
        int leftSum = 0;
        int ans = 0;
        for(int i = 0; i < size; i++){
            int leftRest = leftSum - i * avg;
            int rightRest = (sum - leftSum) - (size - 1 - i) * avg;
            if(leftRest < 0 || rightRest < 0){
                ans = Math.max(ans, Math.abs(leftRest) + Math.abs(rightRest));
            }else{
                ans = Math.max(ans, Math.max(Math.abs(leftRest), Math.abs(rightRest)));
            }
            leftSum += arr[i];
        }
        return ans;
    }

    public static void main(String[] args) {
        int[] arr = {1,2,3,4,5};
        System.out.println(MinOps(arr));
    }
}

运行结果为

3

5. 总结

很简单


http://www.kler.cn/a/448305.html

相关文章:

  • Spring Boot 多数据源解决方案:dynamic-datasource-spring-boot-starter 的奥秘
  • 登山第十六梯:深度恢复——解决机器人近视问题
  • JVM性能优化一:初识内存泄露-内存溢出-垃圾回收
  • ARP..
  • Intel-ECI之Codesys PLC + Ethercat 远端IO + Codesys IDE编程
  • springboot中的AOP以及面向切面编程思想
  • 鸿蒙元服务从0到上架【第二篇】
  • HarmonyOS NEXT 技术实践-实现音乐服务卡片
  • 简单介绍一下缓慢渐变维
  • java篇-maven配置阿里云仓库(图文详解)
  • sass、scss、less、的区别
  • 文献阅读+ARIMA模型学习
  • Fluss 写入数据湖实战
  • 在 docker 内运行命令的一个大坑
  • Centos7 系统初始化
  • MySQL LIST Partitioning 问题求解/吐槽
  • 解锁大数据治理的“密码”与应用奥秘
  • ApacheStruts2 目录遍历与文件上传漏洞复现(CVE-2024-53677,S2-067)(附脚本)
  • 《测试开发方法论》-追踪溯源
  • 【钉钉群聊机器人定时发送消息功能实现】
  • C++ 哈希表封装unordered_map 和 unordered_set
  • 浅谈ORACLE中间件SOA BPM,IDM,OID,UCM,WebcenterPortal服务器如何做迁移切换
  • FLV视频封装格式详解
  • SSM 驱动的 JAVA 网络直播带货查询系统设计及 JSP 成功实现解析
  • 如何确保Java爬虫不超出API使用限制:策略示例
  • Vue 环境变量配置、使用方法、注意事项