Problem:
Score : 500 points

Problem Statement

We have N logs of lengths A_1,A_2,\cdots A_N.

We can cut these logs at most K times in total. When a log of length L is cut at a point whose distance from an end of the log is t (0<t<L), it becomes two logs of lengths t and L-t.

Find the shortest possible length of the longest log after at most K cuts, and print it after rounding up to an integer.

Constraints

1 \leq N \leq 2 \times 10^5

0 \leq K \leq 10^9

1 \leq A_i \leq 10^9

All values in input are integers.

Input

Input is given from Standard Input in the following format:

N K
A_1 A_2 \cdots A_N

Output

Print an integer representing the answer.

Sample Input 1

2 3
7 9

Sample Output 1

4

First, we will cut the log of length 7 at a point whose distance from an end of the log is 3.5, resulting in two logs of length 3.5 each.

Next, we will cut the log of length 9 at a point whose distance from an end of the log is 3, resulting in two logs of length 3 and 6.

Lastly, we will cut the log of length 6 at a point whose distance from an end of the log is 3.3, resulting in two logs of length 3.3 and 2.7.

In this case, the longest length of a log will be 3.5, which is the shortest possible result. After rounding up to an integer, the output should be 4.

Sample Input 2

3 0
3 4 5

Sample Output 2

5

Sample Input 3

10 10
158260522 877914575 602436426 24979445 861648772 623690081 433933447 476190629 262703497 211047202

Sample Output 3

292638192

Solution in C++ (GCC 9.2.1) (judge verdict: Wrong Answer)

#include<cmath>
#include <bits/stdc++.h>
using ll = long long;
using namespace std;
stack<int> st;
queue<int> qu;
queue<pair<int,int> > qu2;
priority_queue<int> pq;
#define rep(i,n) for(int i=0; i<(int)(n); i++)
#define rep2(i,n) for(int i=1; i<=(int)(n); i++)
#define mins(x,y) x=min(x,y)
#define maxs(x,y) x=max(x,y)
typedef set<int> set_t;
typedef set<string> set_g;
typedef complex<double> xy_t;
static const int NIL = -1;
static const int INF = 1000000007;
#define mp make_pair
#define sz(x) int(x.sise())
#define mod 1000000007
#define reps(i,s,n) for(int i = s; i < n; i++)
#define Rreps(i,n,e) for(int i = n - 1; i >= e; --i)
#define Rrep(i,n) Rreps(i,n,0)
deque<int> deq;
#define fi first
#define se second
//const ll MOD = 998244353;
const ll MOD = (1e+9) + 7;
typedef pair<int, int> P;
int main(){
    int n,k;
    cin >> n>>k;
    double a[n];
    rep(i,n){
        cin >> a[i];
    }
    double l=1,r=INF;
    while(r-l>0.5){
        int temp=0;
        double p=(r+l)/2;
        rep(i,n){
            if(a[i]/p==(int)a[i]/p){
                temp+=a[i]/p;
            }else{
                temp+=(int)(a[i]/p)+1;
            }
        }
        if(temp>k){
            l=p;
        }else{
            r=p;
        }
    }
    //cerr<<r<<' '<<l<<endl;
    int ans=0;
    int temp=0;
    double p=r;
    rep(i,n){
        if(a[i]/p==(int)(a[i]/p)){
            temp+=(a[i]/p);
        }else{
            temp+=(int)(a[i]/p)+1;
        }
    }
    if(temp>k){
        if(l==(int)l){
            ans=l;
        }else{
            ans=(int)l+1;
        }
        //cerr<<l<<endl;
    }else{
        if(r==(int)r){
            ans=r;
        }else{
            ans=(int)r+1;
        }
        //cerr<<r<<endl;
        //cerr<<((int)r)<<endl;
    }
    cout<<ans<<endl;
    return 0;
}