From cc51aa3f9a4d37639bed65ca7f5d5948ec6b1e99 Mon Sep 17 00:00:00 2001 From: tetsushi33 Date: Tue, 28 Jun 2022 10:52:59 +0900 Subject: [PATCH 1/4] revised --- src/array.c | 35 ++++++++++++++++++++++++----------- 1 file changed, 24 insertions(+), 11 deletions(-) diff --git a/src/array.c b/src/array.c index 13ed925..69f3848 100644 --- a/src/array.c +++ b/src/array.c @@ -1,18 +1,31 @@ +/* 8.1 配列の二分探索 */ + #include -int n; -int k; +int n; //配列の要素数 +int k; //比較対象 int A[100000]; - int main(){ - int i, lb, ub; - scanf("%d%d", &n, &k); - for(i = 0; i < n; i++){ - scanf("%d", &A[i]); - } - + //ub, lb, A[]の設定 + int i, lb = -1, ub; + scanf("%d%d\n", &n, &k); + ub = n; + for(i = 0; i < n; i++){ + scanf("%d", &A[i]); + } + //binary search + while(ub - lb > 1){ + int mid = (lb + ub) / 2; + if(A[mid] >= k){ + ub = mid; + }else{ + lb = mid; + } + } - return 0; -} + //answer = ub + printf("%d\n", ub); + return 0; +} \ No newline at end of file From fb5c7588a62e5608de5738dc7abb7cefda0fc1e1 Mon Sep 17 00:00:00 2001 From: tetsushi33 Date: Tue, 28 Jun 2022 10:53:48 +0900 Subject: [PATCH 2/4] revised --- src/apple.c | 42 ++++++++++++++++++++++++++++++++++-------- 1 file changed, 34 insertions(+), 8 deletions(-) diff --git a/src/apple.c b/src/apple.c index 766d543..3975dba 100644 --- a/src/apple.c +++ b/src/apple.c @@ -1,17 +1,43 @@ -#include +/* 8.2 リンゴ狩り */ +#include +#define N 1000000000;//a_iが最大かつn,kが最小の時ubも最大 int n; int k; int A[100000]; +int p(int x){ + int i; + //(A/xの切り上げ の総和)<= k で1、それ以外で0 + int sum = 0; + for(i = 0; i < n; i++){ + sum = sum + ((A[i] + x -1) / x); + } + return sum <= k; +} int main(){ - int i, lb, ub; - scanf("%d%d", &n, &k); - for(i = 0; i < n; i++){ - scanf("%d", &A[i]); - } + int i, lb, ub, A_sum = 0;//A_sum:リンゴの総和 + scanf("%d%d", &n, &k); + + for(i = 0; i < n; i++){ + scanf("%d", &A[i]); + A_sum = A_sum + A[i]; + } + lb = A_sum / k;//バッグのサイズは、(リンゴの総和/バッグの数)を下回らない + ub = N; + //binary search + while(ub - lb > 1){ + int mid = (lb + ub) / 2; + if(p(mid)){ + ub = mid; + }else{ + lb = mid; + } + } + //answer = ub + printf("%d\n", ub); - return 0; -} + return 0; +} \ No newline at end of file From e1ef8b680e7f5b93455268c2bda470549c4ab715 Mon Sep 17 00:00:00 2001 From: tetsushi33 Date: Tue, 28 Jun 2022 10:53:59 +0900 Subject: [PATCH 3/4] revised --- src/spear.c | 38 +++++++++++++++++++++++++++++++------- 1 file changed, 31 insertions(+), 7 deletions(-) diff --git a/src/spear.c b/src/spear.c index 766d543..6cbe260 100644 --- a/src/spear.c +++ b/src/spear.c @@ -1,17 +1,41 @@ -#include +/* 8.3 槍作り */ +#include +#define N 1000000000;//槍の長さの最大値は木の長さの最大値 int n; int k; int A[100000]; +int p(int x){ + int i; + //A/xの切り捨て の総和がk未満で1 --> 求める値はlbになる + int sum = 0; + for(i = 0; i < n; i++){ + sum = sum + (A[i] / x); + } + return sum < k; +} int main(){ - int i, lb, ub; - scanf("%d%d", &n, &k); - for(i = 0; i < n; i++){ - scanf("%d", &A[i]); - } + int i, lb, ub; + scanf("%d%d", &n, &k); + lb = 0; + ub = N; + for(i = 0; i < n; i++){ + scanf("%d", &A[i]); + } + //binary search + while(ub - lb > 1){ + int mid = (lb + ub) / 2; + if(p(mid)){ + ub = mid; + }else{ + lb = mid; + } + } + //answer = lb(最大値を求める) + printf("%d\n", lb); - return 0; + return 0; } From 0260cb71cfbd105ae7831e9a28614d581c51bb3b Mon Sep 17 00:00:00 2001 From: tetsushi33 Date: Tue, 28 Jun 2022 11:56:33 +0900 Subject: [PATCH 4/4] revised --- src/works.c | 32 +++++++++++++++++++++++++++++++- 1 file changed, 31 insertions(+), 1 deletion(-) diff --git a/src/works.c b/src/works.c index 766d543..bcfeebd 100644 --- a/src/works.c +++ b/src/works.c @@ -4,6 +4,25 @@ int n; int k; int A[100000]; +int p(int x){ + int woker_num = 1;//仕事量をx以下に抑えるために必要な人数を数える + int work_amount = 0;//仕事量 初期値0 + int i; + for(i = 0; i < n; i++){ + if(A[i] > x) return 0;//1回でxを超える仕事量がある場合0 + //次の時間の仕事量を足してもxを超えないなら仕事を追加 + if(work_amount + A[i] <= x){ + work_amount = work_amount + A[i]; + } + //超えてしまうなら人数を一人増やし仕事量をA[i]にリセット + else{ + woker_num++; + work_amount = A[i]; + } + } + //最終的に使った人数がk以下なら1を返す + return woker_num <= k; +} int main(){ int i, lb, ub; @@ -12,6 +31,17 @@ int main(){ scanf("%d", &A[i]); } - + //A[i]*nの最大値がub + lb = 0; + ub = 1000000000; + while(ub -lb > 1){ + int mid = (lb + ub) / 2; + if(p(mid)){ + ub = mid; + }else{ + lb = mid; + } + } + printf("%d\n", ub); return 0; }