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);
    }
  • 相关阅读:
    源码浅析:MySQL一条insert操作,会写哪些文件?包括UNDO相关的文件吗?
    20201024 --各位码农,节日快乐
    Redis的基本使用
    Oracle 11g与12c的审计详解
    Mac 终端 Tomcat 环境配置过程
    Oracle查询如何才能行转列?-sunziren
    Redis命令大全
    MySQL8.0数据库基础教程(二)-理解&quot;关系&quot;
    mysql 5.7.28 中GROUP BY报错问题 SELECT list is not in GROUP BY clause and contains no
    Flink知识散点
  • 原文地址:https://www.cnblogs.com/xkfz007/p/2763294.html
Copyright © 2011-2022 走看看