diff --git a/src/apple.c b/src/apple.c index 766d543..0bc5fac 100644 --- a/src/apple.c +++ b/src/apple.c @@ -4,6 +4,23 @@ int n; int k; int A[100000]; +//各成分を推定値で割ったときの切り上げの値を足す +int p(int m){ + int sum = 0; + for(int j = 0; j < n; j++){ + sum += (A[j] + m - 1) / m; + } + return (long long int) sum <= k; +} + +//ubの値に代入するために配列の最大値を求める +int m(int B[]){ + int max = 0; + for(int j = 0; j < n; j++){ + if(max <= B[j]) max = B[j]; + } + return max; +} int main(){ int i, lb, ub; @@ -11,7 +28,13 @@ int main(){ for(i = 0; i < n; i++){ scanf("%d", &A[i]); } - - + lb = 0; + ub = m(A); + while(ub - lb > 1){ + int mid = (lb + ub) / 2; + if(p(mid)) ub = mid; + else lb = mid; + } + printf("%d\n", ub); return 0; } diff --git a/src/array.c b/src/array.c index 13ed925..3fe1b7f 100644 --- a/src/array.c +++ b/src/array.c @@ -11,8 +11,13 @@ int main(){ for(i = 0; i < n; i++){ scanf("%d", &A[i]); } - - - + lb = -1; + ub = n; + while(ub - lb > 1){ + int mid = (lb + ub)/2; + if(A[mid] >= k) ub = mid; + else lb = mid; + } + printf("%d\n", ub); return 0; } diff --git a/src/spear.c b/src/spear.c index 766d543..61ef97e 100644 --- a/src/spear.c +++ b/src/spear.c @@ -4,6 +4,15 @@ int n; int k; int A[100000]; +//各成分を推定値で割ったときの切り捨ての値を足す +int p(int m){ + int sum = 0; + for(int j = 0; j < n; j++){ + if(m != 0) sum += A[j] / m; + else sum = k + 1; + } + return (long long int) sum < k; +} int main(){ int i, lb, ub; @@ -11,7 +20,13 @@ int main(){ for(i = 0; i < n; i++){ scanf("%d", &A[i]); } - - + lb = 0; + ub = 100000001; + while(ub - lb > 1){ + int mid = (ub + lb) / 2; + if(p(mid)) ub = mid; + else lb = mid; + } + printf("%d\n", lb); return 0; } diff --git a/src/works.c b/src/works.c index 766d543..a37d281 100644 --- a/src/works.c +++ b/src/works.c @@ -1,17 +1,59 @@ #include +#include +#include -int n; -int k; -int A[100000]; +unsigned int n; +unsigned int k; +unsigned int A[100000]; +int s(){ + int sum = 0; + for(int j = 0; j < n; j++){ + sum += A[j]; + } + return sum; +} + +int m(unsigned int B[]){ + int max = 0; + for(int j = 0; j < n; j++){ + if(max <= B[j]) max = B[j]; + } + return max; +} + +//人の入れ替わりがk-1回起こるようにする +int p(int m){ + int people = 1; + int work = 0; + for(int a = 0; a < n-1; a++){ + if (work == 0) work = A[a]; + if(work + A[a+1] <= m){ + work += A[a+1]; + } + else{ + people++; + work = 0; + } + } + return (long long int) people <= k; +} + int main(){ int i, lb, ub; scanf("%d%d", &n, &k); for(i = 0; i < n; i++){ scanf("%d", &A[i]); } - - + lb = m(A) - 1; + ub = s(); + while(ub - lb > 1){ + int mid = (lb + ub) / 2; + if(p(mid)) ub = mid; + else lb = mid; + } + + printf("%d\n", ub); return 0; }