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

    题目描述

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

    题解

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

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

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

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

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

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

  • 相关阅读:
    jascript基础教程学习总结(2)
    ajax原理图解
    ajax原理
    javascript基础教程学习总结(1)
    HTML学习(1)
    vi编辑器
    effective C++ 4 Make sure objects are initialized before they are used
    effective C++ 3 use const whenever possible
    STL: string:erase
    STL: 从reverse到iterator
  • 原文地址:https://www.cnblogs.com/lzy-blog/p/15350272.html
Copyright © 2011-2022 走看看