二分,验证。
二分一下答案,然后验证一下统计个数能否满足即可。
#include <cstdio> #include <cmath> #include <cstring> #include <algorithm> using namespace std; long long k; long long a[100010]; int sz; long long sum; bool ok(long long x) { long long t=0; for(int i=0;i<sz;i++) { t = t + a[i]/x; } if(t>=k) return 1; return 0; } int main() { scanf("%lld",&k); long long p; while(~scanf("%lld",&p)) { a[sz] = p; sum=sum+a[sz]; sz++; } if(sum<k) { printf("0 "); return 0; } long long L = 1, R = 1000000000, ans; R = R*R; while(L<=R) { long long mid = (L+R)/2; if(ok(mid)) ans = mid, L = mid+1; else R = mid-1; } printf("%lld ",ans); return 0; }