• 关于一个很久之前看过的题目


    很久之前看过一个题目,当时没在意,昨天早上突然想起来,记录一下。题目的大概意思是:

    1. 两男两女,各有不同性病,现只有两个安全套,要求每个男的都和每个女的发生性关系,且不互相传染病。问如何使用安全套?

    至于这个是不是哈佛的题目就不管了,现在也没想到更好的描述方法。就这个题目本身来说是很简单的,下面是解法(N代表男生,V代表女生):

    1. N1--T1+T2--V1(两个TT和在一起用);
    2. N1--T1--V2;
    3. N2--T2--V1;
    4. N2--T2+T1--V1(两个TT和在一起用)。
          通过上面的过程就可以完成了,但是这是两个的情况,如果有N队男女的时候需要多少个?如果给了2N个TT,这个问题就很简单了,因为每个(不管是N还是V都各自占用一个TT),然后一个N和每一个V发生关系的时候就把各自占有的TT合起来使用,这时候是可以保证不发生传染的。
          下面看2N-1个时候可不可以?在有2N个的时候所有的完成之后所有的TT都还有一面没有用过,这是一种浪费。2N-1和图中的联通性的线段数目是一样的。所以,我们的解决方法也就非常简单了:把这2N个人排成一条直线,然后每个TT的两面分别被它左右两边的人占有。N1--T1--V1--T2--....--NX--T(2X-1)--VX,加入当V1要和NX发生关系的时候只要把他们之间的TT全部叠起来使用就可以了(当然是有其他的解决方法的,这只不过是最直观的一种)。这样所有的人发生过关系之后TT的两面都只接触过一个人,也是一种浪费。
          在只有2N-2个TT的时候,这个时候的解决方法也是很简单的:前面的N-1对男女每个人占有一个TT,所以这N-1个人就可以很简单地两两之间完成关系了。剩下的一堆男女是没有TT的。如果剩下的两个人是N1、V1,这是时候只需要选出两个完成的N2、V2。下面的过程和我们刚开始解决问题的时候的情形就一样了。接下来我们考虑更少的TT的情况。现在我们来看TT总共可能有多少种情况:
    1. (0,0)还没有使用过;
    2. (0,1)只有一面使用过;
    3. (1,1)两面都使用过;
    4. (1,2)两面都使用过,但是其中的一面超过两个人使用过。
    从情况1到情况4的转化过程中都是需要发生关系的,但是其中情况2和情况4比较特别(发生关系而情况不变),但是这两种情况是不能共存的。所以情况转换得到的发生关系的数目能补救的平方和不等式两边的差距越大,那么所要用到的TT就越少。所以,2N-2应该就是下线了。
    ------------------------------
    个人理解,欢迎拍砖。
  • 相关阅读:
    聚簇索引和非聚簇索引(通俗易懂 言简意赅)
    Java-线程池专题(什么是线程池,如何使用,为什么要用)
    在Spring Boot中动态实现定时任务配置
    面试被问:如果系统 CPU 突然飙升且 GC 频繁,你该如何排查?
    深入理解volatile
    redis3.0常用命令
    redis3.0配置文件详解
    mysql max_allowed_packet 设置过小导致记录写入失败
    linux 项目部署问题
    python sokct 包详解
  • 原文地址:https://www.cnblogs.com/ggzwtj/p/2171389.html
Copyright © 2020-2023  润新知