diff --git a/src/apple.c b/src/apple.c index 766d543..2f5143a 100644 --- a/src/apple.c +++ b/src/apple.c @@ -4,14 +4,26 @@ int n; int k; int A[100000]; +unsigned int binary_search(int A[], int x, int n){ + int lb = -1; + int ub = n; + while(ub - lb > 1){ + int mid = (lb + ub) / 2; + if(A[mid] >= x) ub = mid; + else lb = mid; + } + return ub; +} int main(){ int i, lb, ub; + int ans; scanf("%d%d", &n, &k); for(i = 0; i < n; i++){ scanf("%d", &A[i]); } - + ans = binary_search(A, k, n); + printf("%d\n", ans); return 0; } diff --git a/src/array.c b/src/array.c index 13ed925..c62b61b 100644 --- a/src/array.c +++ b/src/array.c @@ -5,14 +5,30 @@ int k; int A[100000]; +unsigned int binary_search(int A[], int x, int n){ + int lb = 0; + int ub = 10e8; + while(ub - lb > 1){ + int bag = 0; + int mid = (lb + ub) / 2; + for(int i = 0; i < n; i++){ + bag += (A[i]+mid-1)/mid; // bag = sum of all bags + } + if(bag <= x) ub = mid; + else lb = mid; + } + return ub; +} + int main(){ int i, lb, ub; + int ans; scanf("%d%d", &n, &k); for(i = 0; i < n; i++){ scanf("%d", &A[i]); } - - + ans = binary_search(A, k, n); + printf("%d\n", ans); return 0; } diff --git a/src/spear.c b/src/spear.c index 766d543..c94bfa8 100644 --- a/src/spear.c +++ b/src/spear.c @@ -5,13 +5,30 @@ int k; int A[100000]; +unsigned int binary_search(int A[], int x, int n){ + int lb = 0; + int ub = 10e8; + while(ub - lb > 1){ + int spear = 0; + int mid = (lb + ub) / 2; + for(int i = 0; i < n; i++){ + spear += A[i]/mid; // spear = sum of all spears + } + if(spear >= x) lb = mid; + else ub = mid; + } + return lb; +} + int main(){ int i, lb, ub; + int ans; scanf("%d%d", &n, &k); for(i = 0; i < n; i++){ scanf("%d", &A[i]); } - + ans = binary_search(A, k, n); + printf("%d\n", ans); return 0; } diff --git a/src/works.c b/src/works.c index 766d543..9cab15f 100644 --- a/src/works.c +++ b/src/works.c @@ -4,14 +4,47 @@ int n; int k; int A[100000]; +int check(int A[], int mid, int n, int k){ + int times = 0; + int workers = 1; + + for(int i = 0; i < n; i++){ + if(A[i] > mid){ // fail to complete the job + return 0; + } + else if(times+A[i] <= mid){ + times += A[i]; + } + else if(A[i] <= mid){ + times += A[i]; + workers++; + } + } + + if(workers <= k) return 1; + else return 0; +} + +unsigned int binary_search(int A[], int x, int n){ + int lb = 0; + int ub = 10e8; + while(ub - lb > 1){ + int mid = (lb + ub) / 2; + if(check(A, mid, n, k)) ub = mid; + else lb = mid; + } + return ub; +} int main(){ int i, lb, ub; + int ans; scanf("%d%d", &n, &k); for(i = 0; i < n; i++){ scanf("%d", &A[i]); } - + ans = binary_search(A, k, n); + printf("%d\n", ans); return 0; -} +} \ No newline at end of file