[数学] hdu 4377

该博客讨论了如何构造一个1到N的排列,使最长上升序列和最长下降序列长度最大值最小的问题。作者提到答案是sqrt(N)级别,并通过例子展示了完全平方数的规律。博主提供了一个程序,通过每次以ceil(sqrt(N))为一组,将较大的数分配到后面,以找到字典序最小的排列。虽然问题本身不难,但要获得正确答案需要解决逻辑问题并养成良好的思维习惯。
摘要由CSDN通过智能技术生成
/**
[数学] hdu 4377
解题报告 from 人人HDOJ
其实这是个挺有趣的题,你需要构造一个 1..N 的排列,
使得其最长上升序列的长度和最长下降序列的长度的最大值最小。
应该比较容易能够想到这个答案是 sqrt(N) 级别的,
这个结论的证明可以参考吴文虎的那本组合数学 p21 。
当然这还没有结束,怎么找字典序最小的那个解呢?
先看看完全平方数吧,对于 4 ,我们有 2 1 4 3 ,对于 9 ,我们有 3 2 1 6 5 4 9 8 7 。
嗯,完全平方数的规律还是好找的,那么 5 呢?不就是加一个数么,1 3 2 5 4 ,如
果你觉得这是答案,那你就大错特错了,答案是 1 2 5 4 3 。
同样,对于 10 ,答案是 1 2 6 5 4 3 10 9 8 7 。
于是我们就可以构造程序,每次以 ceil(sqrt(N)) 为一组,
尽量把大的数安排到后面的组中,同时要注意,一定要分出 ceil(sqrt(N)) 组,
能让较小的 1 2 这样的数能够排在前面。
最后,这题并不难,但是做到 1Y 也不容易,
这就要克服各种逻辑上的问题,形成良好的思维习惯,对于解题来说也是十分重要的。
*/
#include <stdio.h>
#include <
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值