• 关于数字的智力题-三个女儿的年龄


    题目:
    一个经理有三个女儿,三个女儿的年龄加起来等于13,三个女儿的年龄乘起来等于经理自己的年龄,有一个下属已知道经理的年龄,但仍不能确定经理三个女儿的年龄,这时经理说只有一个女儿的头发是黑的,然后这个下属就知道了经理三个女儿的年龄。请问三个女儿的年龄分别是多少?为什么?

    解答:
    假设三个女儿按照年龄从小到大的排序时x,y,z。则1<=x,y,z<=11,x+y+z=13。能满足这两个条件的有很多组合,例如11(1,1,11),32(1,4,8)等。明显11(1,1,11)这些的组合是不符合实际情况的,应该事先被排除。这里假设经理比最大年龄的女儿至少大18岁。列举满足条件的组合有

      27(1,3,9)
      32(1,4,8)
      35(1,5,7)
      36(1,6,6)
      36(2,2,9)
      48(2,3,8)
      56(2,4,7)
      60(2,5,6)
      63(3,3,7)
      72(3,4,6)
      75(3,5,5)
      80(4,4,5)

    因为题目中下属知道了经理的年龄,但是依然推不出三个女儿的年龄,则说明经理的年龄在这种情况下的组合应该有两组以上,则上述组合只有36(1,6,6)和36(2,2,9)符合题意。又因为经理说只有一个女儿的头发是黑的,则可进一步排除而得到答案是36(2,2,9)。
    void BrainTester::AgesOfDaughter() {
    	/*
    	 * Suppose the ages of manager's three daughter are respectively x,y,z.
    	 * Then, 1<=x,y,z<=11
    	 */
    	class Triple {
    	public:
    		int x, y, z;
    	};
    	Triple ages;
    	int manager = 0;
    	multimap<int, Triple> result;
    	for (int x = 1; x <= 11; ++x) {
    		for (int y = x; y <= 11; ++y) {
    			for (int z = y; z <= 11; ++z) {
    				if (x + y + z == 13) {
    					manager = x * y * z;
    					if (manager >= z + 18) {
    						ages.x = x;
    						ages.y = y;
    						ages.z = z;
    						result.insert(make_pair(manager, ages));
    					}
    				}
    			}
    		}
    	}
    	set<int> key_set;
    	multimap<int, Triple>::iterator it;
    	for (it = result.begin(); it != result.end(); ++it) {
    		key_set.insert(it->first);
    	}
    	set<int>::iterator it_set;
    	for (it_set = key_set.begin(); it_set != key_set.end(); ++it_set) {
    		if (result.count(*it_set) <= 1) {
    			while ((it = result.find(*it_set)) != result.end())
    				result.erase(it);
    		}
    	}
    
    	for (it = result.begin(); it != result.end(); ++it) {
    		ages = it->second;
    		if (ages.z > ages.y)
    			cout << it->first << "(" << ages.x << "," << ages.y << "," << ages.z
    					<< ")" << endl;
    	}
    }
    

      

      



  • 相关阅读:
    Android碰撞检测——Region碰撞检查
    游戏音乐MediaPlayer和SoundPool常用的一些方法
    游戏框架SurfaceView的简单运用
    Android碰撞检测——矩形检查
    View框架下实现角色的上下左右移动
    数据库导出到Excel前后端代码
    jQuery打印插件PrintArea实现
    showModalDialog 传值及刷新
    文件夹中文件夹(文件)按时间排序,读取最新的文件夹(文件)
    .NET分布式开发报错:“与基础事务管理器的通信失败”的解决方法
  • 原文地址:https://www.cnblogs.com/lhmily/p/3919960.html
Copyright © 2020-2023  润新知