`

智力题:最少需要多少condom?

阅读更多
给出condom的Wiki解释 写道
 

这个问题有很长时间的历史了,但是我一直没有去记录它。至于原因嘛,其实蛮复杂的。首先是这个问题的背景很庸俗、涉及的话题不符合广大人民的道德观和价值观,其次这个问题在实际生活中也不太可能发生。虽然有上面一些原因,不过单纯从思维逻辑和方法思路上面还是值得讨论的,最后我决定还是将这个题目的前前后后写下来。供大家当笑料讨论,或者换个方式当智力题(我尝试过将题目换个场景,不过condom这个工具的特性实在不太好阐述清楚,最后放弃了)出出来。

原始题目 写道
现在有 女,每个人 都有不同的性病。他们希望每个男的都可以和每个女的发生性关系但不传染性病,
不过由于手头不宽裕他们希望能用最少的condom来解决问题。请问最少需要几个,怎么发生性关系?

 原始的问题还是很容易解决的,不管是用最一般的穷举法。最后答案是2.在这里我先不解释原因而是将问题拓展成为一般性问题后在做讨论。

增强性问题 写道
现在有NN 女(N是自然数),每个人 都有不同的性病。他们希望每个男的都可以和每个女的发生性关系但不传染性病,
不过由于手头不宽裕他们希望能用最少的condom来解决问题。请问最少需要几个,怎么发生性关系?

 按照一般的解题思路,我们会先在小范围内讨论:

  1. 当N=0,不需要;
  2. 当N=1,需要一个;
  3. 当N=2,需要两个;
  4. 当N=3,需要四个;
  5. 当N=4,需要六个;
  6. 当N=5,需要七个;
  7. 当N=6,需要九个;
  8. 当N=7,需要十个;
  9. 当N=8,需要十二个。

根据上面的数据我们绘制函数图像:



 由图像,我们可以估计到整个变化趋势应该是一个一次线性关系。

现在我们来具体分析一下这个函数关系。

当N=0,1时,毋庸置疑只有配备0、1个;

当N=2时,我们按照平常的思维:N×N=2×2=4个,这样的确太多了。多的原因在哪里呢?以condom的正反两面来算的话,4×2=8个面。而实际上只有2N=4个人,即有4个面的浪费。我们能否将额外的面降低呢?如果按照传统的思维模式,当然是没有办法降低的。我们现在换一个使用方法:套接

具体的操作 写道
现在我们使用两个condom,命名为C1,C2。根据正反两面,命名为:C1_O,C1_O,C2_I,C2_I.
其实在这里正反是一样的。2男2女分别为:M1,M2,F1,F2.

如果某男(M)与某女(F)使用condom的面为Cm、Cn发生性行为,
则定义为表达式:M >>Cm-Cn>> F
某一面被感染则在后面标记感染者的名字:
M>>Cm(M)-Cn(F)>>F

具体操作:
M1>>C1_O(M1)-C1_I()-C2_O()-C2_I(F1) >>F1
M1>>C1_O(M1)-C1_I(F2)>>F2
M2>>C2_O(M2)-C2_I(F1)>>F1
M2>>C2_O(M2)-C2_I(F1)-C1_O(M1)-C1_I(F2) >>F2

 利用上面的套接法,我们可以直接发现一个规律:所有的面都是贴在某个使用者外面的。

即:F1一直使用着C2_I,F1一直使用着C1_I,M1一直使用着C1_O,M2一直使用着C2_O,然后通过合理组合来达到目的。

先在将2推广到N:则得到表达式为2N-2

现在我们首先解释为什么是2N-2,然后再给出一个这种思路的下界。

首先是N男N女分别带上一个则共用了N×2=2N个,然后和节水管一样互相接都没有问题了。

具体表示 写道
M1 >> C1_O(M1)-C1_I() >> ?
M2 >> C2_O(M1)-C2_I() >> ?
M3 >> C3_O(M1)-C3_I() >> ?
......
......
Mn >> Cn_O(Mn)-Cn_I() >> ?

? >> C[n+1]_O()-C[n+1]_I(F1) >> F1
? >> C[n+2]_O()-C[n+2]_I(F2) >> F2
? >> C[n+3]_O()-C[n+3]_I(F3) >> F3
......
......
? >> C[n+n]_O()-C[n+n]_I(Fn) >> Fn

然后上下随便对接都可以了。

这时候我们发现有严重的浪费,有2N面是干净的。能否降低几个呢?现在去掉M1和F1使用的,然后后面的N-1男和N-1女进行交互,最后后面的N-1男用自己的与第一个F1女交互则产生了:Mk >> Ck_O(Mk)-Ck_I(F1) >> F1;让M1直接使用分配给F2...n的condom,则产生了M1 >> C[n+k]_O(M1)-C[n+k]_I(Fk) >> Fk.

最后让M1随便取下一个使用的 C[n+p]_O(M1)-C[n+k]_I(Fk)再到那N-1男中随便取一个Cq_O(Mq)-Cp_I(F1)套接在一起:C[n+p]_O(M1)-C[n+k]_I(Fk)-Cq_O(Mq)-Cp_I(F1)

产生:M1>> C[n+p]_O(M1)-C[n+k]_I(Fk)-Cq_O(Mq)-Cp_I(F1) >> F1

最后我们是降低了两个,使结果变成了2N-2(并且这些condom的面全部使用了,即完全报废),现在我需要给出利用套接法的这个数据就是下界的证明。

假设还可以去掉一个:则产生了2N-3个condom,抛开M1、M2、F1、F2则另外的N-2男N-2女需要使用:2(N-2)-2=2N-6,还剩下:2N-3-(2n-6)=3。这样我们就发现似乎还有继续减少的余地,不过仔细考虑我们看到有3个分配给前面2男2女用是有余的,但是让他们和后面的N-2男或者N-2女交互的话是不够的。

现在我们得到了下界:2N-2.

即在N大于等于2时,我们得到了2N-2 的最小值。

套接法已经走到了尽头,因为你似乎感觉可以多套几个组合在一起,不过你多套几个和两个相结合其实是一样的,因为干净面永远是干净面无论你前后各套接多少个,如果一个干净的上下都再套干净的没有意义。

 

在穷途末路的时候,解结构(可以认为是问题体系结构)发生了变化。condom可以翻过来戴 (感谢CM的提醒)。

这样以来我们可以将大小降到:[3N/2](下取整).

具体是这样操作的:

翻过来戴 写道
N为偶数:
先让N个女的戴上,这样使用了N个;
再让N/2个男的戴上,这样这N/2男可以随便交互;
交互完毕后,翻过来让另外N/2个男的戴上同样可以完全交互。

N为奇数:
设男的有:2K+1,其中那个1的男的是M
先让N个女的戴上,让k个男的戴上,随便交互一遍;
然后让M直接和那N个女的交互;
最后将那k个男的使用的那些翻过来让另外k个使用,同样可以完全交互。

 综合上述结论我们得到:

[3N/2](下取整)

 

最后我们总结上述讨论:

get N
if N<=1 then
   return N
endif

if N<=4 then
   return (2*N-2)
endif

if (N mod 2 ==0) then
   return (3*N/2)
else
   return (3*(N-1)/2)
endif
#!/usr/bin/ruby
#Compute the condom
print 'Please press the Number of N:'
n = gets.to_i
res = 0
if n <= 1 then
  res = n
elsif n<=4 then
  res = 2*n-2
else
  res = 3*n/2
end
print "The answer is : #{res}.\n"

思路总结:

  1. 思考问题的时候可以先尝试在小范围内穷举出结果,然后利用线性回归等方法估计函数关系
  2. 思路很重要,从简单使用到套接到翻转是思维的巨大飞跃
  3. 最后具体数据实验后的理论化总结可以让我们更好的来回顾我们的思维习惯,并从中提高自己的思维方式 

 

希望有更好的解题方法和思路贡献上来。

  • 描述: 函数图像
  • 大小: 4 KB
分享到:
评论
6 楼 Readonly 2008-10-24  
偶怎么觉得是不一样的,因为中间的套接是可以翻转的,只要保证2边接触的是同一个人就可以了,偶再仔细研究研究...
5 楼 daquan198163 2008-10-24  
说明上不是写得很清楚:做不到100%安全(应该指的是一层)
4 楼 qianjigui 2008-10-24  
Readonly 写道

考虑到condom的厚度和拉伸性,一次套接的个数应该是有限的,为了完善这个模型,应该加上这个参数...

谢谢提醒,在上面的分析中我大概谈了这方面的问题。一般套接两个就是极限了,因为你在中间添加再多的“干净”的condom和只添加一个的效果是一样的。
3 楼 Readonly 2008-10-24  
考虑到condom的厚度和拉伸性,一次套接的个数应该是有限的,为了完善这个模型,应该加上这个参数...
2 楼 yijiangchunshui 2008-10-24  
太对了,楼主,经典,有意思,有机会多来几个。
1 楼 sg552 2008-10-24  
更好的解题方法:

最开始就准备足够的TT.
买就买家庭装的。狼友出门必备,钱包一只,裤兜里一只,夹克内兜里一只。
足够一天的消耗了。

相关推荐

    Android代码-condom

    Project Condom Project Condom is a thin library to wrap the naked Context in your Android project before passing it to the 3rd-party SDK. It is designed to prevent the 3rd-party SDK from common ...

    Video5.Demo3.Duplex

    1. **双工通信的基本概念**:解释了为什么双工通信是必要的,特别是在需要实时交互和双向数据流的应用中。 2. **全双工和半双工的区别**:详细对比了两种模式的工作方式,包括数据传输速率、效率和可能的冲突。 3....

    ProjetoCondominio:关于Python的概述以及对Condomínio的理解

    程序语言II(LP2) 圣保罗联邦学院,布拉干萨保利斯塔 Projeto Semestral-Gerenciamento deCondomínio 积分: 安德丽莎·罗德里格斯(Andressa Rodrigues),BP3012701 Bianca Vital,BP3012999 ...

    ConDom Việt-crx插件

    语言:English 网站避孕套Việtlà网站tintứcvềtìnhyêu。 ...Trang webnàyđượctôilậprađểviếtvềtìnhyêu。 ... Ngoàiracũngbánthêmnhữngsảnphẩmtìnhyêugigiúpcáccặpđôiyêunhaunhiềuhơn!

    Shop - Condom Việt-crx插件

    语言:English 越南客户的在线商店应用程序 condomviet是评估在线商店的应用程序

    CGest - Gestão de Condomínios-开源

    **CGest - 开源物业管理系统** CGest 是一个专为水平物业(如公寓)设计的开源财务管理应用程序。...这款软件的核心优势在于其开放源代码的特性,允许社区成员、开发者和最终用户进行定制、扩展和改进,以满足特定需求...

    hydRopclim:R软件包,可轻松进行水文气候计算

    主要功能是: pgridcorr() :校正月网格点降水量,例如TRMM(热带雨量测量任务)(Condom,Rau和Espinoza,2011年)或其他具有现场站点功能的网格产品。 tgridcorr() :校正目标海拔高度上的每月网格点平均温度,...

    扔掉避孕套,计算避孕安全期的月经日历-crx插件

    No Condom, Rhythm Methods(Menstrual Calendar). Show the women's ovulation date, rhythm methods contraception.扔掉避孕套,避孕安全期的生理日历。根据月经开始日计算避孕安全日和易怀孕日。コンドームを使用...

    radar:卡诺阿斯Projetos卡诺阿斯雷达

    "Esterepositóriocontem projetos do Condomínio Residencial Recreio das Canoas"这部分描述表明,此雷达项目可能与卡诺阿斯的一个名为“Recreio das Canoas”的住宅区有关,可能是为了提供居民安全、娱乐设施的...

Global site tag (gtag.js) - Google Analytics