Solution
分析一下题目, 这道题我们首先分析能不能二分
二分的条件是满足单调性 和 check答案比较简单
这道题目我们可以二分长度, 显然是满足单调性的
每次二分木棍的长度mid, 然后对每个a[i] 都能得到 a[i] / mid 个需要的木棍
我们check一下能不能得到超过k个所需木棍
直接统计满足条件的最大长度即可
注意答案会出现0, ans 初始值我一开始用的 -1
wa了一发orz
Code
#pragma GCC optimize(3) #include <bits/stdc++.h> using namespace std; typedef long long ll; typedef long long LL; const ll mod = 1e9 + 7; const int DEG = 20; const double PI = acos(-1.0); const double eps = 1e-10; const ll inf = 1e18; const int N = 2e5 + 5; static auto faster_iostream = []() { std::ios::sync_with_stdio(false); // turn off sync std::cin.tie(nullptr); // untie in/out streams return 0; }(); int a[N]; int main(){ int n, k; cin >> n >> k; int left = 1, right = 1e9; int ans = 0; // 注意是 0 for(int i = 1; i <= n; i++) cin >> a[i]; while(left <= right){ int mid = (left + right) >> 1; ll cnt = 0; for(int i = 1; i <= n; i++){ cnt += a[i] / mid; } if(cnt < k){ right = mid - 1; } else { ans = mid; // 统计答案 left = mid + 1; } } cout << ans << "\n"; return 0; }