我的代码过不了
//1 1
//1
这个样例,但是满分
#include <bits/stdc++.h>
using namespace std;
const int N = 1e5 + 10;
int n, k, a[N];
int main() {
cin >> n >> k;
for (int i = 0; i < n; i++) cin >> a[i];
sort(a, a + n);
int ll = 0, rr = a[n - 1], res = ll + rr >> 1, ans = 0;
//直接跳过循环了
while (ll + 1 < rr) {
res = ll + rr >> 1;
int l = -1, r = n;
while (l + 1 < r) {
int mid = l + r >> 1;
if (a[mid] >= res) r = mid;
else l = mid;
}
long long sum = 0;
for (int i = r; i < n; i++)
sum += a[i] / res;
if (sum >= k) ll = res, ans = max(ans, res);
else rr = res;
}
cout << ans;
return 0;
}
改正之后的代码:
#include <bits/stdc++.h>
using namespace std;
const int N = 1e5 + 10;
int n, k, a[N];
int main() {
cin >> n >> k;
for (int i = 0; i < n; i++) cin >> a[i];
sort(a, a + n);
//结果集为[1,a[n - 1],初值设为边界
int ll = 0, rr = a[n - 1] + 1, res = ll + rr >> 1, ans = 0;
while (ll + 1 < rr) {
res = ll + rr >> 1;
if(res == 0) break;//加个特判
int l = -1, r = n;
while (l + 1 < r) {
int mid = l + r >> 1;
if (a[mid] >= res) r = mid;
else l = mid;
}
long long sum = 0;
for (int i = r; i < n; i++)
sum += a[i] / res;
if (sum >= k) ll = res, ans = max(ans, res);
else rr = res;
}
cout << ans;
return 0;
}