二分检验答案
注意一个样例 n<m且n中长度都为1. 应该输出0
#include <iostream>
using namespace std;
const int maxn = 200010;
long long arr[maxn];
int n;
long long m;
bool judge(long long num) {
long long ans=0;
for (int i = 1; i <= n; i++) {
long long temp = arr[i];
while (temp - num>= 0) {
temp-=num;
ans++;
}
}
if (ans <m)return false;
return true;
}
long long find(long long l, long long r) {
while (l < r) {
long long mid = l + (r - l+1) / 2;
if (judge(mid))l = mid;
else r = mid - 1;
}
return l;
}
int main()
{
scanf("%d%lld",&n,&m);
long long maxn = 0;
for (int i = 1; i <= n; i++) {
scanf("%lld",&arr[i]);
maxn = max(maxn, arr[i]);
}
if(maxn==1&&n<m){
cout<<"0";
return 0;
}
cout<<find(1, maxn);
}


京公网安备 11010502036488号