• 萌新笔记之鸽巢原理及其应用


    前言:本萌新这里的笔记基本摘自于书+一些自己的浅层理解,如有错误请吐槽!欢迎指正!

    鸽巢原理

    定理:

    如果n+1个物体,被放入n个盒子,那么至少有一个盒子包含两个或多个物体。(这一点无需证明也能理解吧)

    应用1:

    在13个人中存在两个人,他们的生日在同一个月份。(哇,看似好简单啊~这破应用!)

    应用2:

    问题:设有n对夫妇,为保证能够有一对夫妇被选出,至少要从这2n个人中选出多少人?
    其实就是n+1个人对不对。考虑如果我选n个人的话?那么我们一定能构造x个男性,n-x个女性都不存在x个男性的配偶x∈[0,n],那么我们一旦多一个,一定会多一个异性使得“平衡破坏”,而产生一对夫妇。

    应用3:

    这个应用我觉得肯定有人做过这道题目:51nod 1103


    我们简单的思考这个问题,考虑从1位置开始的m个前缀和。


    我们排除这m个前缀和%m==0的情况,因为这样就已经满足整除m了。

    我们知道除以m的数最多只有m-1个非零余数,那么bingo!很明显,这些前缀和必然存在相同的余数。so,如果前缀和sum[1,i]%m==sum[1,j]%m且i<j,那么是不是(sum[1,j]-sum[1-i])%m=0。所以一定存在。

    应用4:

    一位国际象棋大师有11周的时间备战一场锦标赛,他决定每天至少下一盘棋,但每周下棋不超过12盘。证明连续若干天,这位大师恰好下了21盘棋。

    分析:11周-77天,我们考虑sum[1,i]代表从第一天开始到第 i 天的下棋盘数总数,我们能知道这个序列是严格递增的序列
    sum[1,1]<sum[1,2]<sum[1,3]<......<sum[1,77],并且说一星期下棋不超过12盘,那么12*11=132,即

    1≤sum[1,1]<sum[1,2]<sum[1,3]<......<sum[1,77]≤132.
    现在去套上21!1+21(22)≤sum[1,1]+21<sum[1,2]+21<sum[1,3]+21<......<sum[1,77]+21≤132+21(153).
    我们知道由于严格递增,对于任意i≠j,sum[1,i]≠sum[1,j],那么也就可以推出:对于任意i≠j,sum[1,i]+21≠sum[1,j]+21

    那么对于这154(77+77)个数:sum[1,1],sum[1,2],sum[1,3],......,sum[1,77],sum[1,1]+21,sum[1,2]+21,sum[1,3]+21,......,sum[1,77]+21,
    属于[1,153]范围内,一定存在两个相等的数!由于两类各自都不存在相等的数,那么一定存在:i,j,sum[1,i]+21=sum[1,j],也就是说在i+1,i+2,...,j连续这几天内下了21盘棋。
    (这个应用开始有意思了?)

    应用5:

    应用6(中国剩余定理):


  • 相关阅读:
    栈的经典运用-求值数学表达式
    java中Stack的源码解析
    java-背包的实现
    数据库的事务的特性及隔离级别
    EnumMap的用法和源码解析
    java final关键字的解析
    java中的static关键字解析
    XPath如何定位dom节点
    java 枚举(enum) 详细用法
    jdk动态代理
  • 原文地址:https://www.cnblogs.com/keyboarder-zsq/p/6777407.html
Copyright © 2020-2023  润新知