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

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

  

  



原文地址:https://www.cnblogs.com/lhmily/p/3919960.html