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

南昌网站设计公司哪家好网站建设维护有哪些内容

南昌网站设计公司哪家好,网站建设维护有哪些内容,给网站做友情链接,简单的网站建设步骤题目描述 1到n的n个连续的数字组成一个数组,n为3的倍数。 每次按顺序从数组中取出3个元素,去掉这3个元素中的一个最大值和一个最小值,并将剩下的元素累计为S,S初始值为0。 可以通过调整数组中元素的位置改变最终结果,…

题目描述

1到n的n个连续的数字组成一个数组,n为3的倍数。
每次按顺序从数组中取出3个元素,去掉这3个元素中的一个最大值和一个最小值,并将剩下的元素累计为S,S初始值为0。
可以通过调整数组中元素的位置改变最终结果,每移动一个元素计为移动一次。
请计算最少移动几次可以使得数组和S最大。

输入描述:
数组长度n的范围为[3,600]
数组中数字范围[1,10000]
数组由一个字符串表示,不同数字元素之间使用空格分隔

输出描述:
移动次数是一个自然数
无需移动,返回0

用例

输入1 2 3
输出0
说明只有一个三元组[1,2,3],去掉最大最小值Q后剩下2,S=2。无需移动。
输入3 8 9 7 4 2 5 6 1
输出1
说明8+4+5=17
三个三元组:389->8,742->4,561->5,对应的S值为8+4+5=17
将7移动到56之间,三元组调整结果为389,425,761,
389->8,425->4,761->6,8+4+6=18,
18 是所有排列中的最大值,输出 1

通过BFS求解最小移动次数以最大化分组中位数和

解题思路与分析

题目要求我们通过最小移动次数调整数组元素位置,使得数组分组后中位数和达到理论最大值。这是一个典型的状态空间搜索问题,我们可以使用广度优先搜索(BFS) 来寻找最优解。

核心思路

  1. 理论最大S值:通过数学推导,理论最大S值为 (2 * n * n) // 9
  2. 状态空间搜索
    • 每个状态表示数组的一种排列
    • 状态转换:移动一个元素到新位置
    • 目标状态:S值达到理论最大值
  3. BFS优势
    • 逐层搜索保证找到最小移动次数解
    • 使用哈希集合记录访问状态避免重复计算

完整代码实现

from collections import dequedef calculate_s_value(arr):"""计算数组的S值将数组按每3个元素分组,每组去掉最大值和最小值,保留中间值所有中间值的和就是S值参数:arr: 输入数组返回:S值(所有三元组中间值的和)"""total_s = 0# 按每3个元素进行分组处理for i in range(0, len(arr), 3):# 提取当前三元组并排序,取中间值(索引1)triplet = sorted([arr[i], arr[i+1], arr[i+2]])total_s += triplet[1]  # 累加中间值return total_sdef get_all_one_moves(arr):"""生成当前数组状态下所有可能的一步移动结果一步移动定义为:取出一个元素,插入到另一个位置参数:arr: 当前数组状态返回:所有可能的一步移动后的数组状态列表(以tuple形式存储)"""moves = []n = len(arr)# 遍历每个可以移动的元素位置for i in range(n):element = arr[i]  # 要移动的元素# 创建移除该元素后的临时数组temp_arr = arr[:i] + arr[i+1:]# 尝试将该元素插入到每个可能的位置for j in range(n):# 构造插入元素后的新数组new_arr = temp_arr[:j] + [element] + temp_arr[j:]# 只保留真正改变了状态的数组(排除原地不动的情况)if new_arr != arr:moves.append(tuple(new_arr))  # 转换为tuple便于后续去重return movesdef solve():"""主求解函数使用BFS(广度优先搜索)找到达到最大S值所需的最少移动次数"""# 读取输入并解析为整数数组arr = list(map(int, input().split()))n = len(arr)# 计算理论最大S值# 根据题目提示,最大S值为 2*n*n/9s_max = (2 * n * n) // 9# 初始化BFS队列和访问集合# 队列元素格式:(数组状态tuple, 移动次数)queue = deque([(tuple(arr), 0)])# 使用集合记录已访问的状态,避免重复搜索visited = {tuple(arr)}# BFS主循环while queue:# 取出队首状态current_state, moves = queue.popleft()# 将tuple转回list便于计算current_arr = list(current_state)# 检查当前状态是否达到最大S值if calculate_s_value(current_arr) == s_max:print(moves)  # 输出最少移动次数return# 如果还没有超过最大搜索深度,继续扩展搜索if moves < n:# 获取当前状态的所有一步移动结果for next_state in get_all_one_moves(current_arr):# 如果这个状态没有被访问过if next_state not in visited:visited.add(next_state)  # 标记为已访问# 将新状态加入队列,移动次数+1queue.append((next_state, moves + 1))# 如果在n步内找不到解决方案,输出n作为默认值# 理论上对于有效输入,应该能在n步内找到解print(n)# 调用主求解函数
solve()

代码实现解析

1. 计算S值函数

def calculate_s_value(arr):total_s = 0for i in range(0, len(arr), 3):triplet = sorted([arr[i], arr[i+1], arr[i+2]])total_s += triplet[1]return total_s
  • 功能:计算当前数组排列的S值
  • 实现:按三个一组分割数组,每组排序取中间值
  • 时间复杂度:O(n),其中n为数组长度

2. 生成所有可能移动

def get_all_one_moves(arr):moves = []n = len(arr)for i in range(n):element = arr[i]temp_arr = arr[:i] + arr[i+1:]for j in range(n):new_arr = temp_arr[:j] + [element] + temp_arr[j:]if new_arr != arr:moves.append(tuple(new_arr))return moves
  • 功能:生成所有一步移动后的可能状态
  • 关键操作
    1. 取出元素:创建移除该元素的临时数组
    2. 插入元素:尝试所有可能的插入位置
    3. 排除原地不动的情况
  • 状态数量:对长度为n的数组,最多生成n × (n-1)个新状态

3. BFS主算法

def solve():arr = list(map(int, input().split()))n = len(arr)s_max = (2 * n * n) // 9queue = deque([(tuple(arr), 0)])visited = {tuple(arr)}while queue:current_state, moves = queue.popleft()current_arr = list(current_state)if calculate_s_value(current_arr) == s_max:print(moves)returnif moves < n:for next_state in get_all_one_moves(current_arr):if next_state not in visited:visited.add(next_state)queue.append((next_state, moves + 1))print(n)
  • 初始化:开始状态为输入数组,移动次数为0
  • BFS核心
    1. 检查当前状态S值是否达到最大
    2. 生成所有一步移动状态
    3. 过滤已访问状态
    4. 新状态加入队列
  • 终止条件
    • 找到目标状态:输出移动次数
    • 超过n步未找到:输出n作为安全值

示例解析

示例1:输入 “1 2 3”

初始状态: (1, 2, 3)
S值计算: sorted([1,2,3])[1] = 2
理论最大值: (2×3×3)//9 = 2
无需移动 → 输出0

示例2:输入 “3 8 9 7 4 2 5 6 1”

理论最大值: (2×9×9)//9 = 18
初始状态: [3,8,9,7,4,2,5,6,1]
初始S值: 第一组 [3,8,9] → 中位数8第二组 [7,4,2] → 中位数4第三组 [5,6,1] → 中位数5总S=17BFS第一步:移动7到末尾: [3,8,9,4,2,5,6,1,7]分组: [3,8,9]→8, [4,2,5]→4, [6,1,7]→6 → S=18 ✓移动次数=1 → 输出1

状态空间示例(n=3)

初始状态: (1,2,3)
第一层移动:(2,1,3), (2,3,1)(3,1,2), (1,3,2)(1,2,3) 被排除

总结与应用

关键知识点

  1. BFS应用:解决状态空间搜索问题
  2. 问题建模:将优化问题转化为状态转移问题
  3. 移动操作:元素移除与插入的实现技巧
  4. 状态哈希:使用元组和集合管理访问状态

适用场景

  1. 小规模组合优化问题(n≤12)
  2. 需要精确最优解的场合
  3. 移动操作定义明确的状态转移问题

核心启示

“BFS虽然不总是最高效的解法,但在未知解深度且需要最优解的场景中,它提供了一种可靠且直观的搜索策略。”

通过这个解法,我们不仅解决了具体问题,更重要的是展示了状态空间搜索的通用解法框架,可应用于各类排列优化问题。初学者可从此案例学习如何将实际问题转化为状态空间搜索模型,并实现基础BFS算法。


文章转载自:

http://NXF8nDQj.gyxwh.cn
http://nhPVyxMt.gyxwh.cn
http://40gBCVmM.gyxwh.cn
http://Jj3nGWeZ.gyxwh.cn
http://ABcF9VnR.gyxwh.cn
http://HgDYjBFi.gyxwh.cn
http://tIgUM3Jx.gyxwh.cn
http://8TZ09Mm8.gyxwh.cn
http://OKtTKCxN.gyxwh.cn
http://JWrrq7jh.gyxwh.cn
http://W3ydRnT6.gyxwh.cn
http://8ZtIPhIQ.gyxwh.cn
http://7ckZOcDf.gyxwh.cn
http://2dTthKtz.gyxwh.cn
http://HXwREPqg.gyxwh.cn
http://Z4uLMUiw.gyxwh.cn
http://dLXHDfxn.gyxwh.cn
http://uHp66Gxw.gyxwh.cn
http://itBKQor4.gyxwh.cn
http://Ri5cTsaW.gyxwh.cn
http://zAvVNT0G.gyxwh.cn
http://REBBDeD0.gyxwh.cn
http://Dkk6cWQ8.gyxwh.cn
http://vsw2dBtV.gyxwh.cn
http://wLvIx2H5.gyxwh.cn
http://9w3n1FKC.gyxwh.cn
http://FPwrzfM3.gyxwh.cn
http://8UjuRG5r.gyxwh.cn
http://kxIMsO3e.gyxwh.cn
http://Ugj8HrP8.gyxwh.cn
http://www.dtcms.com/wzjs/654629.html

相关文章:

  • 有哪些好的网站项目网络服务商不提供哪项服务
  • 商业网站有什么作用建设网站如何优化关键词
  • 域名购买哪个网站最好电子商务网站开发书例子
  • 推广网站大全呼和浩特网站建设
  • 启东做网站龙岗区建设局网站
  • ps做的网站怎样在dw里打开中国工程建设质量管理协会网站
  • 亚马逊网站怎么做如何提升网站打开速度
  • 服装网站建设项目维护与评价书群晖wordpress目录
  • 门户网站推广方式wordpress如何更改页脚背景颜色
  • 企业网站建设报价单最好的无代码平台
  • 濮阳做网站推广网站 空间 备案
  • 沈阳制作公司网站和app广东个人网站备案
  • 马来西亚的网站后缀闵行区怎么读
  • 绝味鸭脖网站建设规划书wordpress美食主题
  • 清远城乡住房建设部网站网站建设开票分类编码
  • 用vs2012怎么做网站手机网址大全哪个好
  • 秦皇岛市建设局网站关于装配式专家云尚网络建站
  • seo网站系统做微网站的第三方平台有哪些
  • 建设社区网站有什么借鉴之处山西住房和建设厅网站
  • 微网站 源码 免费网站域名怎么修改
  • 整人网站怎么做做个个人网站多少钱
  • 建网站开发语言对比wordpress主题带识图搜索
  • 安网站建设公司保定网站排名
  • 网站建设客户问题wordpress 什么是插件
  • 搭建简单网站珠海建设改革有哪些网站
  • 如何做一个免费的网站app商城系统
  • 进行网站建设有哪些重要意义襄阳做网站多少钱
  • 动易如何做网站宁波网站建设培训
  • 如何自学网站后台组织建设是什么意思
  • 公司网站的seo优化石家庄高端外贸建站