感觉自己又菜了,首先二分答案没看出来,然后二分的时候,漏掉左边界是0,太菜了。
解题思路:
- 直接二分答案,l = 0 , r = 1e9
- 然后判断条件时,我们要左取右不取(根据实际情况来,我这块理解的也不是很好)
- 然后直接输出l就OK
- 主要还是多做些二分的题
代码:
#include <iostream>
#include <cstdio>
using namespace std;
int n, k;
const int N = 200010;
int a[N];
bool check(int x){
long long res = 0;
for (int i = 0; i < n; i ++){
res += a[i] / x;
}
if (res >= k) return true;
return false;
}
int main(){
scanf("%d%d",&n,&k);
for (int i = 0; i < n; i++){
scanf("%d",&a[i]);
}
int l = 0, r = 1e9;
while(l < r){
int mid = (l + r + 1) >> 1;
if (check(mid)) l = mid;
else r = mid - 1;
}
printf("%d\n",l);
return 0;
}