zoukankan      html  css  js  c++  java
  • P3200 [HNOI2009]有趣的数列

    题目描述

    P3200 [HNOI2009]有趣的数列
    样例输入:3 10
    样例输出:5

    题解

    看样例猜做法
    大概猜一猜 观察到答案是卡特兰数列
    接下来我们看看为什么是这样。

    首先化简题目
    对于一个 (2*n) 的排列,我们要求:
    奇数位置上的数递增
    偶数位置上的数递增
    奇偶相邻位置数递增
    奇怪的tip:偶奇相邻不用递增

    首先假设我们把这 (2n) 个数一个个填进去 填到第 (i)
    如果我们要填在偶数位 那么这个数必须比当前偶数大 也必须比上一位的奇数大
    也就是说 这个数如果在偶数位上 需要比前 (i-1) 个数字都大
    得出的结论是 如果这一位是偶数位 下标为 (i) 时的数字至少为 (i)

    那么在奇数位上呢?
    我们发现只要比前几个奇数大就可以了
    也就是说 我们当前这个数一定可以填在第一个空白的奇数位上

    所以题目变成了 对于长度为 (2n) 的序列
    对于当前数 我们要么把他放在最大的偶数位上 要么把他放在最大的奇数位上
    还要求奇数位的数字个数时刻大于等于偶数位
    因为如果奇数位少一个 即偶数位多一个 无论下一个数往哪填 偶数位都没法大于当前的数

    所以问题转化成了卡特兰数列

  • 相关阅读:
    高质量c/c++编程(10)
    .net 访问excel问题
    高质量c/c++编程(9)
    C#排序算法 之 冒泡排序
    C#排序算法 之 希尔排序
    高质量c/c++编程附录
    C#排序算法 之 插入排序
    读《漂亮女上司》有感
    高质量c/c++编程(6)
    高质量c/c++编程(5)
  • 原文地址:https://www.cnblogs.com/lzy-blog/p/15350272.html
Copyright © 2011-2022 走看看