1 条题解
-
0
题意
有三座桥,宽度分别为 、 和 个单位。
每座桥需要 块木板,因此总共需要:- 块长度为 的木板
- 块长度为 的木板
- 块长度为 的木板
木板的标准长度为 单位,可以切割但不能拼接。
问最少需要购买多少根标准长度的木板。
解法
这是一个贪心 + 模拟问题。
我们每次拿出一根长度为 的木板,尝试从剩余需求中优先放置最长的木板,以最大化利用空间。策略
每一根 长度的木板,按以下顺序放置: . 先尽可能多地放 的木板(因为最长,容易浪费空间) . 再放 的木板 . 最后放 的木板
这样每次都能在当前木板上放尽可能多的木板,保证浪费最少。
算法步骤
. 初始化剩余需求:( 的需求),( 的需求),( 的需求) . 当还有需求时( 或 或 ):
- 剩余空间
- 放置 :,更新 和
- 放置 :,更新 和
- 放置 :,更新 和
- 木板数加 . 输出木板总数
复杂度
- 每次循环至少减少一块木板需求,最多循环 次
- 总复杂度 , 非常快
示例验证
样例
输入:
- 初始:
- 第一根木板:
- 放 :,,剩余
- 放 :,,剩余
- 放 :, 不变
- 第二根木板:
- 放 :,剩余
- 放 :
- 放 :,
- 输出: ✅
样例
输入:
模拟后输出: ✅样例
输入:
输出: ✅
完整代码
#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; }
总结
- 贪心策略:每根木板优先放最长的需求(),空间利用率高。
- 直接模拟即可,无需复杂数学公式。
- 时间复杂度 ,空间 。
- 1
信息
- ID
- 7176
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 1
- 标签
- 递交数
- 1
- 已通过
- 1
- 上传者