1 条题解
-
0
暴力版本
#include <bits/stdc++.h> using namespace std; int n, k; int L[100000 + 5]; // 返回能否切出来 k 段长度为 l 的木头 bool ok(int l) { long long cnt = 0; // 记录能切出来几段长度为 l 的木头 for (int i = 1; i <= n; i++) cnt += L[i] / l; return cnt >= k; } int main() { ios::sync_with_stdio(false); cin.tie(0); cin >> n >> k; for (int i = 1; i <= n; i++) cin >> L[i]; for (int l = 1;; l++) { if (!ok(l)) { cout << l - 1; return 0; } } return 0; }
二分优化
#include <bits/stdc++.h> using namespace std; int n, k; int L[100000 + 5]; // 返回能否切出来 k 段长度为 l 的木头 bool ok(int l) { long long cnt = 0; // 记录能切出来几段长度为 l 的木头 for (int i = 1; i <= n; i++) cnt += L[i] / l; // 第 i 段原木长度为 L[i],能切出来 L[i]/l 段长度为 l 的木头 return cnt >= k; } int main() { ios::sync_with_stdio(false); cin.tie(0); cin >> n >> k; for (int i = 1; i <= n; i++) cin >> L[i]; //可能的答案区间在 1 ~ max(L[i]) 之间 int l = 1; int r = 100'000'000; int ans = 0; // 无解时保留 0 while (l <= r) { int mid = (l + r) / 2; if (ok(mid)) { ans = mid; l = mid + 1; } else { r = mid - 1; } } cout << ans; return 0; } // √√√√√√√√√√√√√××××× // ^
- 1
信息
- ID
- 1315
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 6
- 标签
- 递交数
- 22
- 已通过
- 11
- 上传者