人人网笔试题
握手问题:
一对夫妇邀请N-1对夫妇参加聚会(因此聚会上总共有2N人)。每个人都和所有自己不认识的人握了一次手。然后,男主人问其余所有人(共2N-1个人)各自都握了几次手,得到的答案全部都不一样。假设每个人都认识自己的配偶,那么女主人握了几次手?
答案:握手次数只可能是从0到2N-2这2N-1个数。除去男主人外,一共有2N-1个人,因此每个数恰好出现了一次。其中有一个人(0)没有握手,有一个人(2N-2)和所有其它的夫妇都握了手。这两个人肯定是一对夫妻,否则后者将和前者握手(从而前者的握手次数不再是0)。除去这对夫妻外,有一个人(1)只与(2N-2)握过手,有一个人(2N-3)和除了(0)以外的其它夫妇都握了手。这两个人肯定是一对夫妻,否则后者将和前者握手(从而前者的握手次数不再是1)。以此类推,直到握过N-2次手的人和握过N次手的人配成一对。此时,除了男主人及其配偶以外,其余所有人都已经配对。根据排除法,最后剩下来的那个握手次数为N-1的人就是女主人了。
运水赚钱问题:
有一人有240公斤水,他想运往干旱地区赚钱。他每次最多携带60公斤,并且每前进一公里须耗水1公斤(均匀耗水)。假设水的价格在出发地为0,以后,与运输路程成正比,(即在10公里处为10元/公斤,在20公里处为20元/公斤......),又假设他必须安全返回,请问,他最多可赚多少钱?
必须保证多带水,才能保证多卖些。
答案: 设他运送的地点距他的位置有x公里。他每次所携带的60公斤,来回消耗掉2x公斤,则剩下(60-2x)公斤的水,净收入为(60-2x)x元。一共240公斤,可以携带4次。于是一共净赚4(60-2x)x元。
对函数y=4(60-2x)x求导,得到y’=-16x+240。令y’=0,则x=15。此时,y=1800。
此人送往15公里的地方,可以净赚1800元。
砝码称重问题:
用1,3,9,27,…,3^N的砝码如何对一个总量为x的物体进行称重?
现在我们普遍使用十进位制进行数学运算,大概是源于我们的祖先喜欢用手指来计数,毕竟数学首先是一种实用的工具。另一种常使用的进位制是二进位制,在计算机运算之中。
日常生活中好像没有三进制的立足之处。1个季度是3个月,应是三进位制,可是我们说1年是4个季度,而不是11个季度。交通信号的红绿黄的三种状态可以表示0、1、2来描述,这似乎与三进制沾上了边,可是最近红绿黄灯多变成了红绿灯,三进制变成了二进制。
虽然在日常生活中少有表现的机会,但是用三进位制就非常容易解决一道关于砝码的经典趣味数学题。
这道砝码问题是巴协(Bachet)给出的:要想在天平上称出1到40磅在内的任何整磅数,问最少需要几个多重的砝码?这里有两种放置砝码的办法:(1)所有砝码只放进天平的一端,(2)砝码可以放进天平的两端。
对于(1),砝码具有两种状态,不放或者放。记不放为0,放为1,这个问题可以使用二进制来解决。二进制的砝码重量设置为1、2、4、8、16、32。在1到1+2+4+8+16+32也就是63之内的任何数量都可以用1、2、4、8、16、32中的某几个数相加得到。所以问题(1)的砝码数是6个,每个砝码的重量设置为1、2、4、8、16、32磅。
对于(2),砝码具有三种状态,不放、放在天平左端、放在天平右端。记不放为0,放左边为1,放右边为-1,这个问题可以使用三进制来解决。在三进制中,砝码的重量设置为1、3、9、27.。在1到1+3+9+27也就是40之内的任何数量都可以用1、3、9、27中的某几个数相加或者相减获得。
我们来看这几个砝码是如何称量1到40的:
1=1;2=3-1;3=3 ;4=3+1;5=9-3-1 ;6=9-3 ;
7=9-3+1;8=9-1 ;9=9 ;10=9+1 ;11=9+3-1
……
35=27+9-1; 36=27+9;37=27+9+1
38=27+9+3-1;39=27+9+3;40=27+9+3+1
这里,加号意味着天平左边放置砝码,减号意味着天平右边放置砝码(与被称重的物体放在同一端)。
如果我们增加两个砝码81磅和243磅,用6个砝码可以就称重1到364磅的重量。如果砝码继续按3的幂次增加重量,则称重的范围越来越大。用重量为1、3^2、3^3、……、3^n的n个砝码可以称出从1到(3^n-1)/2的所有重量。
问题是,如果一个被称物体较重,我们该如何在天平两端放置砝码呢?这里涉及到十进制向三进制的计算。像十进制转化为二进制一样,转化方法就是连续的除法运算(这里不打算详细介绍)。
例如,(80)10=(2222)3
等式右边的含义是,80可以用2个1、2个3、2个9、2个27相加而成。
在天平称重中,我们要的是最少的砝码数,我们可以把2变成(10-1)3(简记为-1),也就是说,一个大一级的砝码减去一个小一级的砝码。大砝码放在天平左端,小砝码和被称重物一同放在天平右端。
因为,(2222)3=(1000-1)3 ,该式的含义就是用2个1、2个3、2个9、2个27加成的得数等于用1个81减去1的得数。
所以,要称重80磅的物体,需要在天平左边放置1个81磅的砝码,在天平右边放置一个1磅的砝码。
又例如,如果我们用最少的砝码称出了一个331磅的东西,我们究竟用了哪几个砝码呢?
因为(331)10=(110021)3=(1101-11)3
所以,要称重331磅的物体,需要在天平左边放置1个243磅的砝码、1个81磅的砝码、1个9磅的砝码、1个1磅的砝码,在天平右边放置一个3磅的砝码。
因为每一次称量能区别3个球,将12表示为三进制。
在文章的最后,我们把巴协(Bachet)的砝码问题稍稍扩大一些:要想在天平上称出1到500磅在内的任何整磅数,问最少需要几个多重的砝码?这里有两种放置砝码的办法:(1)所有砝码只放进天平的一端,(2)砝码可以放进天平的两端。
下面的代码可以找出在采用两边放砝码的情况下对物体的称重(只用一个砝码)
int poise[M]; int fama(int x){ int k; k=0; int w=x; while(w>0){ poise[k++]=w%3; w/=3; } int i=0; while(i<k) { if(poise[i]>1){ poise[i]-=3; poise[i+1]++; if(i==k-1){ k++; break; } } i++; } for(i=0;i<k;i++) printf("%d ",poise[i]); printf("\n"); }
火柴棍问题:
四人玩火柴棍游戏,每一次都是三个人赢,一个人输。输的人要按赢者手中的火柴
数进行赔偿,即赢者手中有多少根火柴棍,输者就赔偿多少根。现知道玩过四次后,
每人恰好输过一次, 而且每人手中都正好有16根火柴。问此四人做游戏前手中各有
多少根火柴? 编程解决此问题。
void main() { int i, j; int total; int a[4] = {16, 16, 16, 16}; for (i = 0; i < 4; i++) { total = 64; for (j = 0; j < 4; j++) if (i != j) { a[j] /= 2; total -= a[j]; } a[i] = total; } for (i = 0; i < 4; i++) printf(" %d ", a[i]); } void stick(){ int a=16,b=16,c=16,d=16; d=d/2,b=b/2,c=c/2,a=b+c+d+a; d=d/2,a=a/2,c=c/2,b=b+c+d+a; d=d/2,b=b/2,a=a/2,c=b+c+d+a; a=a/2,b=b/2,c=c/2,d=b+c+d+a; printf("the 1th faller has %d stick\n",d); printf("the 2th faller has %d stick\n",c); printf("the 3th faller has %d stick\n",b); printf("the 4th faller has %d stick\n",a); }