Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
42 changes: 34 additions & 8 deletions src/apple.c
Original file line number Diff line number Diff line change
@@ -1,17 +1,43 @@
#include <stdio.h>
/* 8.2 リンゴ狩り */
#include<stdio.h>

#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;//バッグのサイズは、(リンゴの総和/バッグの数)を下回らない
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

リンゴの総和 = バッグの数の時など危ないのでは.
3 3
1 1 1とか.
(入力に依存しない初期値でokです.)

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;
}
35 changes: 24 additions & 11 deletions src/array.c
Original file line number Diff line number Diff line change
@@ -1,18 +1,31 @@
/* 8.1 配列の二分探索 */

#include <stdio.h>

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;
}
38 changes: 31 additions & 7 deletions src/spear.c
Original file line number Diff line number Diff line change
@@ -1,17 +1,41 @@
#include <stdio.h>
/* 8.3 槍作り */
#include<stdio.h>

#define N 1000000000;//槍の長さの最大値は木の長さの最大値
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

初期値が不適切です.

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;
}
32 changes: 31 additions & 1 deletion src/works.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -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;
}