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

0518蚂蚁暑期实习上机考试题1:数组操作

题目

小红认为一个长度为 n 的数组 a 是好的,当且仅当对于任意的 i ,均满足\left | a_i-i \right |相等,其中数组下标 i 从 1 开始,小红每次可以对一个数加 1 或者减 1 ,求把给定的数组变成好数组的最少操作次数。

输入描述:第一行是一个整数n\left ( 1\leq n\leq 1000 \right ),表示数组长度。 第二行是n个整数,第i个为a_i\left ( 1\leq a_i\leq n \right )

输出描述:一个整数,表示把给定的数组变成好数组的最少操作次数。

输入示例1:

3
3 2 1

输出示例1:

2

解释:

将数组[3,2,1]调整为[3,4,1]经过的步数最小,为2;[3,4,1]是一个好数组,满足:

\left | 3-1 \right |=\left | 4-2 \right |=\left | 1-3 \right |=2

输入示例2:

3
1 2 3

输出示例2:

0

解答

此题注意输入的第二句话:数组是n个整数,第i个数组元素为a_i\left ( 1\leq a_i\leq n \right )

我们很容易设对于任意的 i ,都满足\left | a_i-i \right |=k。对于给定的ka_i需要调整到i+k或者i-k。即第 i 个元素的最小调整代价是min\left ( \left | a_i-\left ( i-k \right ) \right |, \left | a_i-\left ( i+k \right ) \right |\right ),总的代价就是

cost=\sum_{i=1}^{n}min\left ( \left | a_i-\left ( i-k \right ) \right |, \left | a_i-\left ( i+k \right ) \right |\right )

因此,只需从0遍历k,得到最小代价时的k,然后返回这个最小代价即可。

那么k的上界应该取多少呢?注意到:

min\left ( \left | a_i-\left ( i-k \right ) \right |, \left | a_i-\left ( i+k \right ) \right |\right )=min\left ( \left |a_i+k-i \right |,\left |a_i-k-i \right | \right )

k\geq n时,可以去掉绝对值:

min\left ( \left |a_i+k-i \right |,\left |a_i-k-i \right | \right )=min\left ( a_i+k-i,k+i-a_i \right )\left ( k\geq n \right )

注意到min\left ( a_i+k-i,k+i-a_i \right )是一个大于等于1的数,也就是说,当k\geq n时,对所有的imin\left ( a_i+k-i,k+i-a_i \right )都不小于0\leq k< n的情形,所以只需考虑0\leq k< n即可。

代码实现:

import sysdef solve():# data = sys.stdin.read().split()# n = int(data[0])# a = list(map(int, data[1:]))n = 10a = [9, 2, 3, 1, 5, 8, 6, 2, 4, 7]ans = float('inf')# 枚举可能的 k 值for k in range(n):total = 0# 对每个位置计算最小操作次数for i in range(1, n + 1):# 直接计算变为 i+k 与 i-k 的代价c1 = abs(a[i - 1] - (i + k))c2 = abs(a[i - 1] - (i - k))total += min(c1, c2)ans = min(ans, total)print(ans)if __name__ == '__main__':solve()

文章转载自:

http://g2ErxZkr.LLsrg.cn
http://KAWI2s84.LLsrg.cn
http://EmgGZpCg.LLsrg.cn
http://eDHKvsby.LLsrg.cn
http://zd9JjFZf.LLsrg.cn
http://64UPQinV.LLsrg.cn
http://lCoGZ8zY.LLsrg.cn
http://yRxKcJFR.LLsrg.cn
http://XmPR0Ok7.LLsrg.cn
http://NxaEfR5b.LLsrg.cn
http://bhiHUNjk.LLsrg.cn
http://BWoFtEJF.LLsrg.cn
http://ZGNyIeQ9.LLsrg.cn
http://cHtpTZvX.LLsrg.cn
http://38GdNGAg.LLsrg.cn
http://4zA1FRxA.LLsrg.cn
http://OgwORZSV.LLsrg.cn
http://jGmDGtwl.LLsrg.cn
http://htoJqoBf.LLsrg.cn
http://IeG8GEBf.LLsrg.cn
http://uNHxNhO5.LLsrg.cn
http://ooPMOdPc.LLsrg.cn
http://89HdBoPk.LLsrg.cn
http://QCgnpdhR.LLsrg.cn
http://45d9waA9.LLsrg.cn
http://mjOgVk5f.LLsrg.cn
http://zoFmFhE0.LLsrg.cn
http://t5cidy3T.LLsrg.cn
http://NZO6KTFE.LLsrg.cn
http://Kwmot3CA.LLsrg.cn
http://www.dtcms.com/a/229434.html

相关文章:

  • “轻量应用服务器” vs. “云服务器CVM”:小白入门腾讯云,哪款“云机”更适合你?(场景、配置、价格对比解析)
  • 神经符号集成-三篇综述
  • Docker 镜像(或 Docker 容器)中查找文件命令
  • 2023-2025 时序大模型相关工作汇总
  • 生产环境中安装和配置 Nginx 以部署 Flask 应用的详细指南
  • 架构设计的目标:高内聚、低耦合的本质
  • Cat.1与Cat.4区别及应用场景
  • 【知识点】第4章:程序控制结构
  • 信息过载时,如何筛选重要信息
  • 手写mask|代码详解,TriangularCausalMask/ProbMask/LocalMask
  • 电子电路:全面深入了解晶振的定义、作用及应用
  • 01 RK3568调试4G 模块 EG800AK-CN
  • SpringCloud 分布式锁Redisson锁的重入性与看门狗机制 高并发 可重入
  • Python语法基础篇(包含类型转换、拷贝、可变对象/不可变对象,函数,拆包,异常,模块,闭包,装饰器)
  • 深度学习入门——基于多层感知机的MNIST手写数字识别
  • Blinko智能笔记系统实现跨平台同步与隐私保护的完整技术方案解析
  • 【C/C++】template 入门到高阶简单大纲
  • 经典SQL查询问题的练习第四天
  • AutoCompose - 携程自动编排【开源】
  • 【亲测有效】Mybatis-Plus中更新字段为null
  • pytorch3d+pytorch1.10+MinkowskiEngine安装
  • PyTorch--池化层(4)
  • Attention Is All You Need (Transformer) 以及Transformer pytorch实现
  • pytorch基本运算-导数和f-string
  • 互联网大厂Java求职面试:AI大模型与云原生技术的深度融合
  • MySQL关系型数据库学习
  • 第三发 DSP 点击控制系统
  • 【MATLAB代码】制导方法介绍与例程——三点法|三维空间,动态目标导引(订阅专栏后可直接查看源代码)
  • leetcode hot100 链表(一)
  • matlab实现求解兰伯特问题