首页 > 代码库 > 关于数字的智力题-三个女儿的年龄

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

题目:
一个经理有三个女儿,三个女儿的年龄加起来等于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) {			result.erase(result.find(*it_set));		}	}	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;	}}