题解
【入门】搬砖问题
1 条题解
-
0
解题思路
36 块砖,36 人搬,男人每人搬 4 块,女人每人搬 3 块,两个小孩抬一块。问男人、女人、小孩各多少。
设男人 i 个、女人 j 个、小孩 k 个。要满足两个条件:
- 人数正好 36:i + j + k = 36
- 砖数正好 36:4×i + 3×j + k÷2 = 36(两个小孩搬一块,所以 k 个小孩搬 k/2 块)
思路:枚举男人和女人数,算出小孩数再检查。
- 男人最多 36-3-1 个(至少要留 1 个女人和 2 个小孩)
- 枚举男人 i 后,剩下的砖 x = 36 - 4×i 由女人和小孩搬
- 枚举女人 j,小孩搬的砖数 y = x - 3×j(注意 y 是小孩搬的砖,小孩人数 = 2y)
- 检查人数:i + j + 2y 是否等于 36,等于就输出一组方案
为什么要用 2y 表示小孩数? 因为两个小孩才搬一块砖,如果小孩搬了 y 块砖,那小孩的人数就是 2y。
参考代码
#include <iostream> using namespace std; int main() { int i, j, x, y; for (i = 1; i <= 36 - 3 - 1; i++) { x = 36 - i * 4; // 剩下的砖由女人和小孩搬 for (j = 1; j <= x - 1; j++) { y = x - j * 3; // 小孩搬的砖数 if (i + j + y * 2 == 36) { // 人数正好 36 cout << i << " " << j << " " << y * 2; } } } return 0; }复杂度分析
- 时间复杂度:O(N²),两重循环枚举
- 空间复杂度:O(1)
- 1