4.1 把所有情况都列出来

数学是我们日常生活中不可或离的知识,例如,购买商品的价格、数量,接待来访客户的数量,与客户签订合同的数量和金额等,这些都用了到最基本的数学知识计数。

计数,是我们从幼儿园、小学就开始学习的最基本数学知识,可是,到现在为止,你会计数吗?能正确的计数吗?

4.1.1 从0还是1开始

计数还会出错?好吧,那我们来看一个例子。

小张每天从家里到办公室去上班乘坐地铁都要购买3元的票,再多坐一站都需要购买4元的票(根据当地地铁公司的票价规定,乘坐10个区间的票价为3元)。请问,小张早上去上班要路过多少个车站?

你可能觉得这太简单了吧,这也是一个问题?

根据题意,小张购买的是3元的车票,再多坐一站都要购买4元的车票,说明小张坐的车站是3元内的最多车站数,即10站。

所以,小张早上上班路过的车站是10个站。

可是,这个答案却是错误的!

正确的答案应该是要经过11个车站。为什么是这样呢?看图4-1就可得到答案。

在图4-1中,经过的区间用圆圈中的数字表示,经过的车站的编号用下方的数字表示。从图中可看到,小张从地铁站Home出发,经过10个区间到达Office站,包括Home站在内,一共经过了11个地铁站,其中Home的编号为0。

alt

图4-1

这是从0开始计数的表示方式,与我们平常从1开始计数有些不同,所以很多人都容易在这里犯错。

对于从0开始计数的情况,最后的数据数量应是计数值加上1,即:

alt

其实,从0开始计数这种方式程序员应该是比较熟悉的,在C、Java等流行的程序设计语言中,数组的下标都是从0开始计数,例如,有以下C语言程序:

alt

执行以上C语言程序,可得到如图4-2所示的结果。

alt

图4-2

从图4-2所示的执行结果可看到,数组元素的序号从0开始,程序中定义的数组具有10个元素,其序号为0~9。

因此,如果是以0开始计数,要注意:

alt

4.1.2 赛程安排

赛程安排也是一个计数问题。

在比赛的赛程安排中,不能漏掉参赛的每一位选手,也不能为某一位选手安排重复的比赛。这就是计数中需要解决的两个问题:遗漏和重复。

某学校举行乒乓球比赛,在初赛阶段设置为单循环赛,设有n位选手参赛,每位选手要与其余每位选手进行一场比赛,然后按积分排名选拔进入决赛的选手。这个比赛的赛程应该怎么安排呢?

为了简化,先以5位选手参加比赛为例来进行分析。

首先,每位选手都要与其余的每位选手进行一场比赛,制作一张二维表,将参赛选手分别排在行和列中。在纵横方向上都可以设置与之进行比赛的选手,得到如图4-3所示比赛对阵表。

alt

图4-3

在图4-3所示的比赛对阵表中,选手自己不能与自己比赛(如甲与不能与甲进行比赛),因此,图中显示的比赛总场次为:

alt

可是,看图4-3还可发现一个问题,每位选手进行了两场比赛。例如,从行方向来看,第1行中,甲与乙进行了一场比赛,在第2行中乙与甲也进行了一场比赛。如果甲与乙进行比赛、乙再与甲进行比赛,甲、乙两位选手就进行了两场比赛。其他选手的比赛场次也与此相同。

这样,就出现了计数中的“重复”问题,即某一现象被重复计数。

根据比赛规则,每一位选手只能与其余的每位选手进行一场比赛。因此,选手对阵表应如图4-4所示,这时只考虑右上角那些打对勾的比赛场次就行了。

alt

图4-4

从图4-4中可看到各选手与对手的比赛场次:

alt

即,比赛的总场次为:

alt

经过10场比赛,各选手都与对手进行了一次单循环比赛,没有遗漏,也没有重复。

从上面的算式中提取相应的规律,对于有n位选手参加的单循环比赛,需要举行的比赛总场次为:

alt

例如,有5位选手参赛,则比赛的总场次为:

alt

若有10位选手参赛,则比赛的总场次为:

alt