From b077a6854551680efb9fbfd6735db450f6860c76 Mon Sep 17 00:00:00 2001 From: Rirai Ikeda Date: Sat, 18 Jun 2022 21:06:59 +0900 Subject: [PATCH 1/3] submit --- src/array.c | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/src/array.c b/src/array.c index 13ed925..7d7be3b 100644 --- a/src/array.c +++ b/src/array.c @@ -8,11 +8,21 @@ int A[100000]; int main(){ int i, lb, ub; scanf("%d%d", &n, &k); + lb = -1; + ub = n; for(i = 0; i < n; i++){ scanf("%d", &A[i]); } - - + while (ub - lb > 1){ + int mid = (lb + ub) / 2; + if (A[mid] >= k){ + ub = mid; + } + else { + lb = mid; + } + } + printf("%d\n", ub); return 0; } From 9a945b2721ee64daaf4a23924b1ffb7cdee97f72 Mon Sep 17 00:00:00 2001 From: Rirai Ikeda Date: Sat, 18 Jun 2022 22:19:44 +0900 Subject: [PATCH 2/3] submit --- src/apple.c | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/src/apple.c b/src/apple.c index 766d543..8130134 100644 --- a/src/apple.c +++ b/src/apple.c @@ -4,6 +4,13 @@ int n; int k; int A[100000]; +int p(int x){ + int s = 0, i; + for(i = 0; i < n; i++){ + s = s + (A[i] + x - 1) / x; + } + return s; +} int main(){ int i, lb, ub; @@ -11,6 +18,19 @@ int main(){ for(i = 0; i < n; i++){ scanf("%d", &A[i]); } + lb = 0; + ub = 1000000000; + while(ub - lb > 1) { + int mid = (lb + ub) / 2; + if(p(mid) <= k){ + ub = mid; + } + else{ + lb = mid; + } + printf("%d %d \n", lb, ub); + } + printf("%d\n", ub); return 0; From 7e8c98280da6185be6e632a7c852a34ce43cbaa2 Mon Sep 17 00:00:00 2001 From: Rirai Ikeda Date: Mon, 27 Jun 2022 18:49:21 +0900 Subject: [PATCH 3/3] revised --- src/apple.c | 7 ++----- src/array.c | 2 +- src/spear.c | 25 +++++++++++++++++++++++-- src/works.c | 42 ++++++++++++++++++++++++++++++++++++++++-- 4 files changed, 66 insertions(+), 10 deletions(-) diff --git a/src/apple.c b/src/apple.c index 8130134..2ba5fe6 100644 --- a/src/apple.c +++ b/src/apple.c @@ -9,7 +9,7 @@ int p(int x){ for(i = 0; i < n; i++){ s = s + (A[i] + x - 1) / x; } - return s; + return s <= k; } int main(){ @@ -22,16 +22,13 @@ int main(){ ub = 1000000000; while(ub - lb > 1) { int mid = (lb + ub) / 2; - if(p(mid) <= k){ + if(p(mid) == 1){ ub = mid; } else{ lb = mid; } - printf("%d %d \n", lb, ub); } printf("%d\n", ub); - - return 0; } diff --git a/src/array.c b/src/array.c index 7d7be3b..56199e1 100644 --- a/src/array.c +++ b/src/array.c @@ -25,4 +25,4 @@ int main(){ printf("%d\n", ub); return 0; -} +} \ No newline at end of file diff --git a/src/spear.c b/src/spear.c index 766d543..35a3b6d 100644 --- a/src/spear.c +++ b/src/spear.c @@ -4,6 +4,13 @@ int n; int k; int A[100000]; +int p(int x){ + int s = 0, i; + for(i = 0; i < n; i++){ + s = s + (A[i] / x); + } + return s < k; +} int main(){ int i, lb, ub; @@ -11,7 +18,21 @@ int main(){ for(i = 0; i < n; i++){ scanf("%d", &A[i]); } - - + lb = 0; + ub = 1000000000; + if(p(1) == 1){ + printf("%d\n", 0); + return 0; + } + while(ub - lb > 1){ + int mid = (lb + ub) / 2; + if(p(mid) == 1){ + ub = mid; + } + else{ + lb = mid; + } + } + printf("%d\n", lb); return 0; } diff --git a/src/works.c b/src/works.c index 766d543..f277481 100644 --- a/src/works.c +++ b/src/works.c @@ -4,14 +4,52 @@ int n; int k; int A[100000]; +/* 指定した下限の仕事量xに対し、その仕事量xを超えるまで +i=0の仕事量から順に足し合わせてゆく。もしある仕事量単体で +xを超えるならそのxは下限なりえないゆえ0を強制的に返す。 +そうではないうえで足していった後にもし超えるなら再びカウントを +0に戻して同じように足していく。0に戻した瞬間がl回起こったらxを +超えないぎりぎりの分け方がl+1個ある、ということになる。このlが +もしkを超えていたらxの値が小さすぎて細かく分けないと1人当たり仕事量が +xを簡単に超えてしまうことになるのだから関数は0を返す。k以上ならば +xの値が十分大きく、細かく分けなくても1人当たり仕事量がxを超えない +ことになるから関数は1を返す。このようにすると関数の0と1の境目であるxは +1人当たり仕事量がxをぎりぎり超えない仕事分配法で、しかも境界右の1は分け方は +k以下であることになる。もしここでのlが真にkより小さくても適当に +k個の分担になるようにさらに分割すればよいので、やはいこれが求めるxである。*/ +int p(int x){ + int index = 1, quantity = 0, i; + for(i = 0; i < n; i++){ + if(x < A[i]){ + return 0; + } + if(x < quantity + A[i]){ + quantity = 0; + index = index + 1; + } + quantity = quantity + A[i]; + } + return index <= k; +} int main(){ int i, lb, ub; + scanf("%d%d", &n, &k); for(i = 0; i < n; i++){ scanf("%d", &A[i]); } - - + lb = 0; + ub = 10000; + while(ub - lb > 1){ + int mid = (lb + ub) / 2; + if(p(mid) == 1){ + ub = mid; + } + else{ + lb = mid; + } + } + printf("%d\n", ub); return 0; }