1 条题解

  • 0
    @ 2026-5-17 19:39:54

    题意

    有三座桥,宽度分别为 181821212525 个单位。
    每座桥需要 nn 块木板,因此总共需要:

    • nn 块长度为 1818 的木板
    • nn 块长度为 2121 的木板
    • nn 块长度为 2525 的木板

    木板的标准长度为 6060 单位,可以切割但不能拼接。
    问最少需要购买多少根标准长度的木板。


    解法

    这是一个贪心 + 模拟问题。
    我们每次拿出一根长度为 6060 的木板,尝试从剩余需求中优先放置最长的木板,以最大化利用空间。

    策略

    每一根 6060 长度的木板,按以下顺序放置: 11. 先尽可能多地放 2525 的木板(因为最长,容易浪费空间) 22. 再放 2121 的木板 33. 最后放 1818 的木板

    这样每次都能在当前木板上放尽可能多的木板,保证浪费最少。

    算法步骤

    11. 初始化剩余需求:a=na = n1818 的需求),b=nb = n2121 的需求),c=nc = n2525 的需求) 22. 当还有需求时(a>0a>0b>0b>0c>0c>0):

    • 剩余空间 use=60use = 60
    • 放置 2525t=min(c,use/25)t = min(c, use/25),更新 ccuseuse
    • 放置 2121t=min(b,use/21)t = min(b, use/21),更新 bbuseuse
    • 放置 1818t=min(a,use/18)t = min(a, use/18),更新 aauseuse
    • 木板数加 11 33. 输出木板总数

    复杂度

    • 每次循环至少减少一块木板需求,最多循环 3n3n
    • 总复杂度 O(n)O(n)n1000n \le 1000 非常快

    示例验证

    样例 11

    输入:11

    • 初始:a=1,b=1,c=1a=1, b=1, c=1
    • 第一根木板:
      • 2525t=min(1,60/25=2)=1t = \min(1, 60/25=2) = 1c=0c=0,剩余 3535
      • 2121t=min(1,35/21=1)=1t = \min(1, 35/21=1) = 1b=0b=0,剩余 1414
      • 1818t=min(1,14/18=0)=0t = \min(1, 14/18=0) = 0a=1a=1 不变
    • 第二根木板:
      • 2525c=0c=0,剩余 6060
      • 2121b=0b=0
      • 1818t=min(1,60/18=3)=1t = \min(1, 60/18=3) = 1a=0a=0
    • 输出:22

    样例 22

    输入:33
    模拟后输出:44

    样例 33

    输入:10001000
    输出:11671167


    完整代码

    #include <bits/stdc++.h>
    using namespace std;
    
    int main() {
        int n;
        cin >> n;
        int ans = 0;
        int a = n, b = n, c = n;  // 需求:a:18, b:21, c:25
        while (a > 0 || b > 0 || c > 0) {
            int use = 60;
            int t = min(c, use / 25);
            c -= t;
            use -= t * 25;
            t = min(b, use / 21);
            b -= t;
            use -= t * 21;
            t = min(a, use / 18);
            a -= t;
            use -= t * 18;
            ans++;
        }
        cout << ans << endl;
        return 0;
    }
    

    总结

    • 贪心策略:每根木板优先放最长的需求(25>21>1825 > 21 > 18),空间利用率高。
    • 直接模拟即可,无需复杂数学公式。
    • 时间复杂度 O(n)O(n),空间 O(1)O(1)
    • 1

    信息

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