我曾经把我从各处总结的智力题(也即是稍微需要点技巧的)题目,拿给周围的人解,鲜有人能很快给出解决方案,更不消说充满技巧性的解决方案。所以,一时之间,第一次接触,想不出答案,并不丢脸,需要有意识的训练与总结。
命题与其逆否命题相互等价
A ⇒ B ⇕ ¬ B ⇒ ¬ A A\Rightarrow B\\ \Updownarrow\\ \neg B\Rightarrow \neg A A⇒B⇕¬B⇒¬A
举例,所有的POD类型都是Aggregates,
则如果一个类不是Aggregates,则它断然不是POD类型。
POD ⇒ Aggregates ⇕ ¬ Aggregates ⇒ ¬ POD \text{POD}⇒ \text{Aggregates}\\ \Updownarrow\\ \neg \text{Aggregates}⇒ \neg \text{POD} POD⇒Aggregates⇕¬Aggregates⇒¬POD
三个瓶盖能换一瓶水,问100个人需要喝水,最少需要买多少瓶水即可解决100人的喝水问题
1+2 -> 3
1+2+2 -> 6
1+2+2+2 -> 9
…
100个人,3人做一组,共33组,余1人,也即100/333, 100%31,3瓶水换一瓶,也即一组需要买两瓶(需要有一个作为启动),所以结论很明显了,100/33*2+1=67
def need(n, b):
return int(n/b*(b-1))+n%b
我们接着使用更为常规的编程方法实现对所需瓶盖的计算:
int need(int n, int k)
{
// n: 表示需要喝饮料的人数
// k: 表示多少瓶盖可以换一瓶水
int cnt, drunk, caps = 0, 0, 0;
// cnt: 表示买多少瓶水
// drunk: 表示已喝过水的人数
// caps: 当前的瓶盖数
while (drunk < n)
{
++cnt; ++drunl; ++caps;
if (caps % k == 0) // if(caps == k)
{
++drunk;
caps = 1;
}
}
return cnt;
}
int main(int, char**)
{
std::cout << need(100, 3) << std::endl;
// 67
return 0;
}
概率问题
公司年会,一个员工中奖的概率是
1
10
\frac1{10}
101,他有十次抽奖的机会,请问他很不幸,一次都没有抽中的概率是?
公司年会,一个员工中奖的概率是
1
10000
\frac1{10000}
100001,他有10000次抽奖的机会,请问他很不幸,一次都没有抽中的概率是?
1 − ( 1 − 1 10 ) 10 ≈ 1 − 0.349 = 0.651 1 − ( 1 − 1 10000 ) 10000 ≈ 1 − 0.368 = 0.632 1-(1-\frac1{10})^{10}\approx1-0.349=0.651\\ 1-(1-\frac1{10000})^{10000}\approx1-0.368=0.632 1−(1−101)10≈1−0.349=0.6511−(1−100001)10000≈1−0.368=0.632
本质是:
lim
n
→
∞
(
1
−
1
n
)
n
=
1
e
\lim_{n\to\infty}(1-\frac1{n})^n=\frac1e
n→∞lim(1−n1)n=e1
1 e ≈ 0.36787944117144233 \frac1e\approx0.36787944117144233 e1≈0.36787944117144233