1 solutions

  • 0
    @ 2025-8-17 14:22:32

    题意

    最小切割刀数,使得最后切割完的矩形的1K1 \leq K

    思路

    首先可以注意到 HH 很小。我们可以通过暴力枚举 2H2^H 枚举所有横着切的方案,当我们确定横着切了多少刀的时候,纵的方案可以贪心,每次尽量靠后切。

    #include <bits/stdc++.h>
    using namespace std;
    typedef long long ll;
    int main()
    {
        ll N, M, K, L, R, H, W;
        cin >> H >> W >> K;
        vector<string> s(H);
        for (auto &i : s)
            cin >> i;
        int ans = 0x3f3f3f3f;
        for (int i = 0; i < 1 << (H - 1); i++)
        {
            vector<vector<int>> bag;
            vector<int> c;
            c.push_back(0);
            for (int j = 0; j < H - 1; j++)
            {
                if ((i >> j) & 1)
                {
                    bag.push_back(c);
                    c.clear();
                    c.push_back(j + 1);
                }
                else
                {
                    c.push_back(j + 1);
                }
            }
            bag.push_back(c);
            vector<int> num(bag.size());
            int box = bag.size() - 1;
            for (int j = 0; j < W; j++)
            {
                vector<int> add(bag.size());
                for (int k = 0; k < bag.size(); k++)
                {
                    for (auto l : bag[k])
                    {
                        if (s[l][j] == '1')
                            add[k]++;
                    }
                }
                bool flag = true;
                for (int k = 0; k < bag.size(); k++)
                {
                    if (num[k] + add[k] > K)
                    {
                        flag = false;
                    }
                    if (add[k] > K)
                    {
                        box = 0x3f3f3f3f;
                        flag = false;
                    }
                }
                if (flag)
                {
                    for (int k = 0; k < bag.size(); k++)
                    {
                        num[k] += add[k];
                    }
                }
                else
                {
                    box++;
                    num = add;
                }
            }
            ans = min(ans, box);
        }
        cout << ans << endl;
        return 0;
    }
    

    Information

    ID
    43
    Time
    1000ms
    Memory
    256MiB
    Difficulty
    8
    Tags
    (None)
    # Submissions
    24
    Accepted
    6
    Uploaded By