https://atcoder.jp/contests/typical90/tasks/typical90_a
C言語
#include <stdio.h>
#include <stdlib.h>
// プロトタイプ宣言
int check(int N, int K, int* A, int scoreC);
int main(void) {
// 入力
int N, L, K;
scanf("%d %d\\n%d\\n", &N, &L, &K);
int* A;
A = (int*)malloc(sizeof(int) * N);
for (int i = 0; i < N; i++) {
scanf("%d", &A[i]);
}
// 最後の値はLとする
A[N] = L;
// スコアの設定
int scoreA = 1;
int scoreB = L;
// 二分探索
while(scoreA != scoreB){
int scoreC = (scoreA + scoreB) / 2 + 1;
int scoreD = check(N, K, A, scoreC);
if(scoreD == 1){
scoreA = scoreC;
}else{
scoreB = scoreC - 1;
}
}
printf("%d\\n", scoreA);
free(A);
return 0;
}
int check(int N, int K, int* A, int scoreC){
int cutA = 0;
int cutNum = 0;
// 差分計算
for(int i = 0; i < N + 1; i++){
if(i == 0){
cutA = A[0];
}else{
cutA += A[i] - A[i-1];
}
if(cutA >= scoreC){
cutA = 0;
cutNum++;
}
}
if(cutNum > K){
return 1;
}else{
return 0;
}
}