top1编程
← 返回题目
题解

【入门】搬砖问题

1 条题解

  • 0
    @ 2026-7-31 11:35:23

    解题思路

    36 块砖,36 人搬,男人每人搬 4 块,女人每人搬 3 块,两个小孩抬一块。问男人、女人、小孩各多少。

    设男人 i 个、女人 j 个、小孩 k 个。要满足两个条件:

    1. 人数正好 36:i + j + k = 36
    2. 砖数正好 36:4×i + 3×j + k÷2 = 36(两个小孩搬一块,所以 k 个小孩搬 k/2 块)

    思路:枚举男人和女人数,算出小孩数再检查。

    1. 男人最多 36-3-1 个(至少要留 1 个女人和 2 个小孩)
    2. 枚举男人 i 后,剩下的砖 x = 36 - 4×i 由女人和小孩搬
    3. 枚举女人 j,小孩搬的砖数 y = x - 3×j(注意 y 是小孩搬的砖,小孩人数 = 2y)
    4. 检查人数: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