2021-08-19:超级洗衣机。假设有 n 台超级洗衣机放在同一排上。开始的时候,每台洗衣机内可能有一定量的衣服,也可能是空的。在每一步操作中,你可以选择任意 m (1 ≤ m ≤ n) 台洗衣机,
2021-08-19:超级洗衣机。假设有 n 台超级洗衣机放在同一排上。开始的时候,每台洗衣机内可能有一定量的衣服,也可能是空的。在每一步操作中,你可以选择任意 m (1 ≤ m ≤ n) 台洗衣机,与此同时将每台洗衣机的一件衣服送到相邻的一台洗衣机。给定一个非负整数数组代表从左至右每台洗衣机中的衣物数量,请给出能让所有洗衣机中剩下的衣物的数量相等的最少的操作步数。如果不能使每台洗衣机中衣物的数量相等,则返回 -1。
福大大 答案2021-08-19:
这道题是见过就会,没见过就不会。
首先看能否平均分配。如果不能平均分配,就不进行下一步了;如果能平均分配,就下一步。
情况一,+a、i、-b,a正和b正取最大值。
情况二,+a、i、+b,a正和b正取最大值。
情况三,-a、i、-b,a正+b正。
情况四,-a、i、+b,a正和b正取最大值。
遍历数组,取最大值就是需要的返回值。
代码里第2种方法,数组的每个元素减去了平均值,方便计算。
时间复杂度:O(N)。
额外空间复杂度:O(1)。
代码用golang编写。代码如下:
package main
import "fmt"
func main() {
arr := []int{1, 2, 3, 4, 5}
ret := findMinMoves1(arr)
fmt.Println(ret)
ret = findMinMoves2(arr)
fmt.Println(ret)
}
func findMinMoves1(arr []int) int {
if len(arr) == 0 {
return 0
}
size := len(arr)
sum := 0
for i := 0; i < size; i++ {
sum += arr[i]
}
if sum%size != 0 {
return -1
}
avg := sum / size
leftSum := 0
ans := 0
for i := 0; i < len(arr); i++ {
leftRest := leftSum - i*avg
rightRest := (sum - leftSum - arr[i]) - (size-i-1)*avg
if leftRest < 0 && rightRest < 0 {
ans = getMax(ans, Abs(leftRest)+Abs(rightRest))
} else {
ans = getMax(ans, getMax(Abs(leftRest), Abs(rightRest)))
}
leftSum += arr[i]
}
return ans
}
func findMinMoves2(arr []int) int {
if len(arr) == 0 {
return 0
}
size := len(arr)
sum := 0
for i := 0; i < size; i++ {
sum += arr[i]
}
if sum%size != 0 {
return -1
}
avg := sum / size
sum = 0
//数组每个元素全部减去平均值
for i := 0; i < size; i++ {
arr[i] -= avg
sum += arr[i]
}
leftSum := 0
ans := 0
for i := 0; i < len(arr); i++ {
leftRest := leftSum
rightRest := sum - leftSum - arr[i]
if leftRest < 0 && rightRest < 0 {
ans = getMax(ans, Abs(leftRest)+Abs(rightRest))
} else {
ans = getMax(ans, getMax(Abs(leftRest), Abs(rightRest)))
}
leftSum += arr[i]
}
//数组恢复
for i := 0; i < size; i++ {
arr[i] += avg
}
return ans
}
func Abs(a int) int {
if a < 0 {
return -a
} else {
return a
}
}
func getMax(a int, b int) int {
if a > b {
return a
} else {
return b
}
}
执行结果如下:

2021-08-19:超级洗衣机。假设有 n 台超级洗衣机放在同一排上。开始的时候,每台洗衣机内可能有一定量的衣服,也可能是空的。在每一步操作中,你可以选择任意 m (1 ≤ m ≤ n) 台洗衣机,的更多相关文章
- 2021.08.16 P1260 工程规划(差分约束)
2021.08.16 P1260 工程规划(差分约束) 重点: 1.跑最短路是为了满足更多约束条件. P1260 工程规划 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 题意: 造 ...
- 2021.08.01 P4359 伪光滑数(二叉堆)
2021.08.01 P4359 伪光滑数(二叉堆) [P4359 CQOI2016]伪光滑数 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 题意: 若一个大于 11 的整数 MM ...
- hdu5795 A Simple Nim 求nim求法,打表找sg值规律 给定n堆石子,每堆有若干石子,两个人轮流操作,每次操作可以选择任意一堆取走任意个石子(不可以为空) 或者选择一堆,把它分成三堆,每堆不为空。求先手必胜,还是后手必胜。
/** 题目:A Simple Nim 链接:http://acm.hdu.edu.cn/showproblem.php?pid=5795 题意:给定n堆石子,每堆有若干石子,两个人轮流操作,每次操作 ...
- 日常Javaweb 2021/11/19
Javaweb Dao层: //连接数据库,实现增查功能 package dao; import java.sql.Connection; import java.sql.DriverManager; ...
- 2021.12.19 eleveni的刷题记录
2021.12.19 eleveni的刷题记录 0. 本次记录有意思的题 0.1 每个点恰好经过一次并且求最小时间 P2469 [SDOI2010]星际竞速 https://www.luogu.com ...
- 2021.08.30 前缀函数和KMP
2021.08.30 前缀函数和KMP KMP算法详解-彻底清楚了(转载+部分原创) - sofu6 - 博客园 (cnblogs.com) KMP算法next数组的一种理解思路 - 挠到头秃 - 博 ...
- 2021.08.16 P1078 文化之旅(最短路)
2021.08.16 P1078 文化之旅(最短路) 题意: n个地,k个信仰,每个地都有自己的信仰,信仰之间会相互排斥,同信仰之间也会相互排斥,有m条路,问从s到t的最短距离是多少? 有一位使者要游 ...
- 2021.08.16 P1300 城市街道交通费系统(dfs)
2021.08.16 P1300 城市街道交通费系统(dfs) P1300 城市街道交通费系统 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 题意: 城市街道交费系统最近创立了.一 ...
- 2021.08.16 P1363 幻象迷宫(dfs,我感受到了出题人浓浓的恶意)
2021.08.16 P1363 幻象迷宫(dfs,我感受到了出题人浓浓的恶意) P1363 幻象迷宫 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 题意: 幻象迷宫可以认为是无限 ...
- 2021.08.10 Euler函数总结
2021.08.10 Euler函数总结 知识: 记 φ(n) 表示在 [1,n] 中与 n互质的数的个数. 1.p为质数,则 \[φ(p^l)=p^l-p=p^{l-1}(p-1) \] 注:每p个 ...
随机推荐
- 飞桨AI 文本实体抽取 数据准备(excel 文本标注)
网纸: https://ai.baidu.com/easydl/app/deploy/tee/public #!/usr/bin/env python3 # -*- coding: utf-8 -*- ...
- ESP32 优化 IRAM 内存方法整理 ---ESP32
有以下三种方便的方法来优化 IRAM 内存: 启用 menuconfig -> Compiler option -> Optimization Level -> Optimize f ...
- 三分钟搭建一个自己的 ChatGPT (从开发到上线)
原文链接:https://icloudnative.io/posts/build-chatgpt-web-using-laf/ OpenAI 已经公布了 ChatGPT 正式版 API,背后的新模型是 ...
- Python查找存储区0KB文件并记录下地址
查找存储区域中0KB大小文件,可以根据需要变更指定大小. #-*- coding: utf-8 -*- #!/usr/bin/python from os.path import isdir,absp ...
- P4774 倚天屠龙传 题解
其实这道题的主体并不难,主要是细节很多 我们可以把题目分成界限分明的两部分,第一部分,屠每条龙所用的剑只和当前拥有的剑有关.于是可以单独开一个数据结构按题目维护. 另一部分找到最小攻击次数,可以化作以 ...
- MS SQL Server 删除重复行数据
您可以使用以下 SQL 语句删除 MS SQL Server 表中重复的行: WITH CTE AS ( SELECT ROW_NUMBER() OVER(PARTITION BY column1, ...
- 【LeetCode贪心#09】用最少数量的箭引爆气球(涉及区间重叠情况判断)
用最少数量的箭引爆气球 力扣题目链接(opens new window) 在二维空间中有许多球形的气球.对于每个气球,提供的输入是水平方向上,气球直径的开始和结束坐标.由于它是水平的,所以纵坐标并不重 ...
- Nacos 服务发现
更多内容,前往 IT-BLOG 一.Nacos 简介 Nacos 是阿里的一个开源产品,它是针对微服务架构中的服务发现.配置管理.服务治理的综合型解决方案.Nacos 使服务更容易注册,并通过 DNS ...
- Android LineChart 折线图Demo
1 首先在 build.gradle 里导入包 implementation 'com.github.PhilJay:MPAndroidChart:v3.1.0' 2.新建 启动Activity Li ...
- jwt 学习笔记
概述 JWT,Java Web Token,通过 JSON 形式作为 Web 应用中的令牌,用于在各方之间安全地将信息作为 JSON 对象传输,在数据传输过程中还可以完成数据加密.签名等相关处理 JW ...