zoukankan      html  css  js  c++  java
  • HNOI 排队

    某中学有 n 名男同学,m 名女同学和两名老师要排队参加体检。他们排成一条直线,并且任意两名女同学不能相邻,两名老师也不能相邻,那么一共有多少种排法呢?(注意:任意两个人都是不同的)

    只有一行且为用空格隔开的两个非负整数 n 和 m,其含义如上所述。
    对于 30%的数据 n≤100,m≤100
    对于 100%的数据 n≤2000,m≤2000

    样例输入

    1 1

    样例输出

    12

    码量很小,关键是式子和高精。

    插空和捆绑思想,加法定理。

    先插入两个老师,因为老师只有两个,而男生就算只有一个也可以隔开,但先插入女生的话可能有未隔开但需要老师隔开的情况。

    考虑老师有两种情况

    (一开始我只考虑了一种,且先插入的是女生,然后样例过了,一直认为自己的式子是对的认为高精上出了错...不要轻信样例

       然后发现要先插入老师,该成这个后样例就过不了了,开始水样例手摸,终于发现少了一种情况...)。

    A(n,n)*A(n+1,2)*A(n+3,m)+A(n,n)*A(n+1,1)*A(2,2)×A(m,1)×A(n+2,m-1)

    第一种:A(n,n)*A(n+1,2)*A(n+3,m);不让两个老师挨着插入,然后插空法插入女生;

    第二种(易忽略):两个老师一开始可以挨着啊,然后用女生来隔开(没有手摸感觉我是找不出来了...)

    所以让一个女生和两个老师绑在一起插空。但这里需要注意女生有m个所以有m种,老师之间也有两种排法;

    A(n,n)*A(n+1,1)*2*m*A(n+2,m-1)(剩下的女生插空);

    或者写成A(n,n)*A(n+1,1)*A(2,2)[两个老师间]×A(m,1)[写成C(m,1)也行,m个里选出一个](三捆绑插空及内部)×A(n+2,m-1);

    高精上:只用高精乘低精和高精加就行,把A除的式子直接消去分母,注意不要用高精乘高精,同一个大式子里用一个数组一直高精乘低精,会快很多。

    总结:

    1.不要迷信样例和自己的式子;

    2.手动模拟的好处;

    3.每一个点和式子,每一种情况都要考虑到位(分情况);

    4.简化消去式子,高精变低精。

    5.能优化的地方一定要优化。

  • 相关阅读:
    设计模式--17、建造者模式
    设计模式--16、原型模式
    面向对象的几大设计原则
    设计模式--15、模板方法模式
    设计模式--14、中介者模式
    设计模式--13、享元模式
    设计模式--12、外观模式
    设计模式--11、命令模式
    消息中间件ActiveMQ、RabbitMQ、RocketMQ、ZeroMQ、Kafka如何选型?
    Kafka,Mq,Redis作为消息队列有何差异?
  • 原文地址:https://www.cnblogs.com/three-D/p/11110286.html
Copyright © 2011-2022 走看看