zoukankan      html  css  js  c++  java
  • 人人网笔试题

    握手问题:

    一对夫妇邀请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);
    }
  • 相关阅读:
    June. 26th 2018, Week 26th. Tuesday
    June. 25th 2018, Week 26th. Monday
    June. 24th 2018, Week 26th. Sunday
    June. 23rd 2018, Week 25th. Saturday
    June. 22 2018, Week 25th. Friday
    June. 21 2018, Week 25th. Thursday
    June. 20 2018, Week 25th. Wednesday
    【2018.10.11 C与C++基础】C Preprocessor的功能及缺陷(草稿)
    June.19 2018, Week 25th Tuesday
    June 18. 2018, Week 25th. Monday
  • 原文地址:https://www.cnblogs.com/xkfz007/p/2763294.html
Copyright © 2011-2022 走看看