1 条题解
-
0
#include <bits/stdc++.h> using namespace std; const int MAXN = 100000; int n, k; int L[MAXN + 5]; // 返回能否切出来 k 段长度为 len 的木头 bool check(int len) { long long cnt = 0; // 统计能切出多少段 for (int i = 1; i <= n; i++) cnt += L[i] / len; 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]; // 计算原木的最大长度及长度之和 int maxL; long long sumL; maxL = sumL = L[1]; for (int i = 2; i <= n; i++) { maxL = max(maxL, L[i]); sumL += L[i]; } // 特殊情况,切不出来 m 段长度为 1 的 if (sumL < k) { cout << 0; return 0; } // 做法 1:枚举答案(超时) for (int i = 1; i <= maxL; i++) if (!check(i)) { cout << i - 1 << "\n"; return 0; } // 做法 2:二分答案(满分) int l = 1; int r = maxL; int ans = 0; while (l <= r) { int mid = (l + r) / 2; if (check(mid)) { ans = mid; l = mid + 1; } else r = mid - 1; } cout << ans << "\n"; return 0; }
- 1
信息
- ID
- 1315
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 9
- 标签
- 递交数
- 11
- 已通过
- 6
- 上传者