圆排列(heightround.pas/c/cpp)HGOI0607

本文详细介绍了圆排列问题的解决思路,从最初的贪心策略尝试,到最终发现1 2开头的数列差值最大值为最优解的结论,并提供了AC程序实现。此外,还提及了双线程动态规划(DP)的解决方案,以求得问题的最优解。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

圆排列 (heightround.pas/c/cpp) 题解

题目描述:

有 N 个人顺时针围在一圆桌上开会,他们对身高很敏感。 因此决定想使得任意相邻的两人的身高
差距最大值最小。 如果答案不唯一,输出字典序最小的排列,指的是身高的排列。

分析

  • 今日测试的第一题…如此简短的题目描述让人害怕。
    一上手没有特别好的思路,于是想各种贪心策略。
    一开始的想法是排成大小序号1,2,4,6,8 … 2k,2k+1,2k-1…7,5,3。
    后来不完全证明发现并非最优解。
  • 思考了十分钟,左倾错误判断告诉我数列开头从1到a,后面再一头一尾排完a+1到n。
  • 然后再枚举1到n-1作为有序序列开头,根据上述规则生成序列,再得出最优解
  • 于是9分……..
  • 订正时发现1 2开头的数列中差值最大值一定最优(不完全归纳???),应该有方法证明,以后再贴上来orz
  • 找到最优值之后再使用递增排序原序列。从左向右扫描,其中tail指针先指向第一个数,如果发现当前数减去tail指向数大于minn就将这个数从后向前放在最大值之后。不断更新就可以得出最优解emmm。
  • 100分到手!!!
  • 当然最优值也可以不用贪心,还可以有双线程DP求解。具体见excitedfrog的博客。

AC程序

#include <iostream>
#include <algorit
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值