关于数字的智力题-三个女儿的年龄
题目:
一个经理有三个女儿,三个女儿的年龄加起来等于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; } }