From 4498b69796f2ee5e9ff36abf4d8c225dc4a64e82 Mon Sep 17 00:00:00 2001 From: Ryoya Nambara Date: Tue, 28 Jun 2022 01:53:52 +0900 Subject: [PATCH 1/3] submit --- src/apple.c | 27 +++++++++++++++++++++++++-- src/array.c | 11 ++++++++--- src/spear.c | 28 ++++++++++++++++++++++++++-- src/works.c | 51 ++++++++++++++++++++++++++++++++++++++++++++++----- 4 files changed, 105 insertions(+), 12 deletions(-) diff --git a/src/apple.c b/src/apple.c index 766d543..f1fdb72 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 s(){ + int sum = 0; + for(int j = 0; j < n; j++){ + sum += A[j]; + } + return sum; +} 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 = s(); + 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..1c3d44b 100644 --- a/src/spear.c +++ b/src/spear.c @@ -4,6 +4,24 @@ 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; +} + +//ubの値に代入するために配列の成分の和を求める +int s(){ + int sum = 0; + for(int j = 0; j < n; j++){ + sum += A[j]; + } + return sum; +} int main(){ int i, lb, ub; @@ -11,7 +29,13 @@ int main(){ for(i = 0; i < n; i++){ scanf("%d", &A[i]); } - - + lb = 0; + ub = s(); + 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..4d778a2 100644 --- a/src/works.c +++ b/src/works.c @@ -1,17 +1,58 @@ #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 sum = 0; + int people = 1; + for(int a = 0; a < n; a++){ + //a=0から足すだけだとmの最小値が求まらないため、 + //0からn-1まで全てを出発点にする必要がある。 + sum += A[a]; + if(sum > m){ + sum = 0; + people++; + } + } + 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; } From 18868fe41ad44de322b4c1d2a8595d07159779b0 Mon Sep 17 00:00:00 2001 From: Ryoya Nambara Date: Tue, 5 Jul 2022 00:53:25 +0900 Subject: [PATCH 2/3] revised --- src/apple.c | 12 ++++++------ src/spear.c | 10 +++++----- src/works.c | 12 ++++-------- 3 files changed, 15 insertions(+), 19 deletions(-) diff --git a/src/apple.c b/src/apple.c index f1fdb72..0bc5fac 100644 --- a/src/apple.c +++ b/src/apple.c @@ -13,13 +13,13 @@ int p(int m){ return (long long int) sum <= k; } -//ubの値に代入するために配列の成分の和を求める -int s(){ - int sum = 0; +//ubの値に代入するために配列の最大値を求める +int m(int B[]){ + int max = 0; for(int j = 0; j < n; j++){ - sum += A[j]; + if(max <= B[j]) max = B[j]; } - return sum; + return max; } int main(){ @@ -29,7 +29,7 @@ int main(){ scanf("%d", &A[i]); } lb = 0; - ub = s(); + ub = m(A); while(ub - lb > 1){ int mid = (lb + ub) / 2; if(p(mid)) ub = mid; diff --git a/src/spear.c b/src/spear.c index 1c3d44b..99dae90 100644 --- a/src/spear.c +++ b/src/spear.c @@ -15,12 +15,12 @@ int p(int m){ } //ubの値に代入するために配列の成分の和を求める -int s(){ - int sum = 0; +int m(int B[]){ + int max = 0; for(int j = 0; j < n; j++){ - sum += A[j]; + if(max <= B[j]) max = B[j]; } - return sum; + return max; } int main(){ @@ -30,7 +30,7 @@ int main(){ scanf("%d", &A[i]); } lb = 0; - ub = s(); + ub = m(A); while(ub - lb > 1){ int mid = (ub + lb) / 2; if(p(mid)) ub = mid; diff --git a/src/works.c b/src/works.c index 4d778a2..37cea06 100644 --- a/src/works.c +++ b/src/works.c @@ -25,16 +25,12 @@ int m(unsigned int B[]){ //人の入れ替わりがk-1回起こるようにする int p(int m){ - int sum = 0; int people = 1; - for(int a = 0; a < n; a++){ - //a=0から足すだけだとmの最小値が求まらないため、 - //0からn-1まで全てを出発点にする必要がある。 - sum += A[a]; - if(sum > m){ - sum = 0; - people++; + for(int a = 0; a < n-1; a++){ + if(A[a] + A[a+1] <= m){ + A[a+1] = A[a] + A[a+1]; } + else people++; } return (long long int) people <= k; } From f6064a736d721aeb136df9ea2d58e9bc3b8b51b2 Mon Sep 17 00:00:00 2001 From: Ryoya Nambara Date: Mon, 8 Aug 2022 22:24:46 +0900 Subject: [PATCH 3/3] revised --- src/spear.c | 11 +---------- src/works.c | 11 ++++++++--- 2 files changed, 9 insertions(+), 13 deletions(-) diff --git a/src/spear.c b/src/spear.c index 99dae90..61ef97e 100644 --- a/src/spear.c +++ b/src/spear.c @@ -14,15 +14,6 @@ int p(int 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; scanf("%d%d", &n, &k); @@ -30,7 +21,7 @@ int main(){ scanf("%d", &A[i]); } lb = 0; - ub = m(A); + ub = 100000001; while(ub - lb > 1){ int mid = (ub + lb) / 2; if(p(mid)) ub = mid; diff --git a/src/works.c b/src/works.c index 37cea06..a37d281 100644 --- a/src/works.c +++ b/src/works.c @@ -26,11 +26,16 @@ int m(unsigned int B[]){ //人の入れ替わりがk-1回起こるようにする int p(int m){ int people = 1; + int work = 0; for(int a = 0; a < n-1; a++){ - if(A[a] + A[a+1] <= m){ - A[a+1] = A[a] + A[a+1]; + if (work == 0) work = A[a]; + if(work + A[a+1] <= m){ + work += A[a+1]; + } + else{ + people++; + work = 0; } - else people++; } return (long long int) people <= k; }