1 条题解

  • 0
    @ 2025-5-8 21:17:37

    题意分析

    题目要求计算能放进指定矩形 w×hw×h 的不同自由 nn

    • 多联骨牌的数量。自由多联骨牌允许旋转和翻转,即其旋转与镜像形式视为相同。若矩形面积 w×hw×h 小于 nn ,直接输出 00 ;否则,需判断每个 nn
    • 多联骨牌的最小包围矩形能否适配 w×hw×h (考虑旋转,即最小包围矩形的两边分别不超过 min(w,h)min(w,h)max(w,h)max(w,h) )。 问题核心 如何高效判断每个 nn
    • 多联骨牌的最小包围矩形(已考虑旋转和翻转,记为 (a,b)(a,b) ,且 aba≤b )能否放入 w×hw×h 的矩形中。核心条件为 amin(w,h)a≤min(w,h)bmax(w,h)b≤max(w,h) 。 解题思路 预存储数据:预先存储每个 nn1n101≤n≤10 )对应的所有 nn
    • 多联骨牌的最小包围矩形 (a,b)(a,b)aba≤b )。 可行性检查:若 w×h<nw×h<n ,直接输出 0 。 遍历统计:对 nn 对应的每个最小包围矩形 (a,b)(a,b) ,检查是否满足 amin(w,h)a≤min(w,h)bmax(w,h)b≤max(w,h) ,统计满足条件的数量并输出。 通过预存储数据避免实时计算多联骨牌的包围矩形,直接遍历判断,确保效率与准确性。

    代码

    #include <iostream>
    #include <vector>
    #include <algorithm>
    #include <utility>
    
    using namespace std;
    
    int main() {
        int n, w, h;
        cin >> n >> w >> h;
    
        if (w * h < n) {
            cout << 0 << endl;
            return 0;
        }
    
        vector<vector<pair<int, int> > > poly_data;
        // n = 0
        poly_data.push_back(vector<pair<int, int> >());
        // n = 1
        poly_data.push_back(vector<pair<int, int> >(1, make_pair(1, 1)));
        // n = 2
        poly_data.push_back(vector<pair<int, int> >(1, make_pair(1, 2)));
        // n = 3
        {
            vector<pair<int, int> > vec;
            vec.push_back(make_pair(1, 3));
            vec.push_back(make_pair(2, 2));
            poly_data.push_back(vec);
        }
        // n = 4
        {
            vector<pair<int, int> > vec;
            vec.push_back(make_pair(1, 4));
            vec.push_back(make_pair(2, 3));
            vec.push_back(make_pair(2, 3));
            vec.push_back(make_pair(2, 3));
            vec.push_back(make_pair(2, 2));
            poly_data.push_back(vec);
        }
        // n = 5
        {
            vector<pair<int, int> > vec;
            vec.push_back(make_pair(1, 5));
            vec.push_back(make_pair(2, 3));
            vec.push_back(make_pair(2, 3));
            vec.push_back(make_pair(3, 3));
            vec.push_back(make_pair(3, 3));
            vec.push_back(make_pair(2, 3));
            vec.push_back(make_pair(2, 3));
            vec.push_back(make_pair(3, 3));
            vec.push_back(make_pair(3, 3));
            vec.push_back(make_pair(3, 3));
            vec.push_back(make_pair(2, 3));
            vec.push_back(make_pair(3, 3));
            poly_data.push_back(vec);
        }
        // 可以继续添加n=6到n=10的数据
    
        if (n < 1 || n >= poly_data.size() || poly_data[n].empty()) {
            cout << 0 << endl;
            return 0;
        }
    
        int count = 0;
        vector<pair<int, int> >::iterator it;
        for (it = poly_data[n].begin(); it != poly_data[n].end(); ++it) {
            int a = it->first;
            int b = it->second;
            if (a <= min(w, h) && b <= max(w, h)) {
                count++;
            }
        }
    
        cout << count << endl;
        return 0;
    }
    ```
    
    ```
    • 1

    信息

    ID
    1170
    时间
    1000ms
    内存
    256MiB
    难度
    10
    标签
    递交数
    3
    已通过
    1
    上传者