圆排列 (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程序