#include<stdio.h> int n; int k; long long int l = 0; //左界为0; long long int r = 1e9; //右界为1e9; long long int p[500000]; long long int pa(long long int x) { long long int len = 0; if (x == 0) return k; //当mid为0时返回k; for (int i = 1; i <= n; i++) { len += p[i] / x; } return len; } int main() { scanf("%d%d", &n, &k); for (int i = 1; i <= n; i++) { scanf("%d", &p[i]); } long long int mid; mid = (l + r) / 2; while (l <= r) { int cnt = pa(mid); if (mid == 1 && cnt < k) { //当mid==1&&cnt<k说明没有满足这个的k,没有答案; printf("0"); return 0; } else if (cnt < k) { //当cnt<k时说明mid过大;让边界r=mid-1,变小一点; r = mid - 1; } else if (cnt >= k && mid != 0) { //这样保证了cnt>k的来源是存在解的; l = mid + 1; } else { //mid=0,是一定是一个解,但也要判断1是不是解 如0 1 mid=0; l = mid + 1; } mid = (l + r) / 2;//这个位置很重要:先判断前一个mid满足让l=mid+1,后一个mid } //不满足让r=mid-1,这样可以保证这个mid是对的,并且这个mid printf("%lld", mid); //使得第三个mid与第一个mid相等,并将其为答案; return 0; } /*-说明:只要cnt>k出现了l一定变大,这样其实一定能找到莫个cnt是的成立 cnt=k有两种情况1.当mid=0,因为0肯定满足,所以可以让l=mid+1,找还有没有这样的值 如果有就找到 2.存在cnt=k,就可以向前找知道l>r就可以找出最大值满足这个条件*/