https://www.acmicpc.net/problem/1654
1654번: 랜선 자르기
첫째 줄에는 오영식이 이미 가지고 있는 랜선의 개수 K, 그리고 필요한 랜선의 개수 N이 입력된다. K는 1이상 10,000이하의 정수이고, N은 1이상 1,000,000이하의 정수이다. 그리고 항상 K ≦ N 이다. 그
www.acmicpc.net
랜선의 길이 범위가 자연수 int 범위 이내이고, 문제가 랜선의 길이 범위 이내에서 랜선을 자를 최적의 길이를 찾는 문제이므로 이분 탐색을 실행할 수 있다.
#include <cstdio>
typedef unsigned int ui;
#define MAX_K 10000
ui K, N, cable[MAX_K];
// 모든 랜선을 길이 mid로 잘랐을 때 랜선을 N개 이상 얻을 수 있다면 true
bool cable_cut(ui mid) {
// 모든 랜선을 mid개로 잘라 얻은 개수를 sum에 저장
ui sum = 0;
for (int i = 0; i < K; i++) sum += cable[i] / mid;
// 얻은 랜선 수가 N개 이상인지 여부를 반환
return sum >= N;
}
int main() {
// min, max, mid: 이분 탐색에 사용할 랜선을 자를 길이
ui min = 1, max = __INT_MAX__, mid = (min + max) / 2;
// 문제의 조건을 입력받은 뒤
scanf("%d %d", &K, &N);
for (int i = 0; i < K; i++) scanf("%d", cable + i);
// 자를 랜선 길이에 대해 이분 탐색을 실행해 최적의 길이를 찾는다
while (min <= max) {
if (cable_cut(mid)) min = mid + 1;
else max = mid - 1;
mid = (min + max) / 2;
}
// 랜선을 잘라 N개 이상 얻을 수 있는 최소의 길이를 출력
printf("%d\n", mid);
return 0;
}
'알고리즘 > 문제 풀이' 카테고리의 다른 글
1697번: 숨바꼭질 (0) | 2021.12.09 |
---|---|
1676번: 팩토리얼 0의 개수 (0) | 2021.12.09 |
1647번: 도시 분할 계획 (0) | 2021.12.09 |
1644번: 소수의 연속합 (0) | 2021.12.09 |
1629번: 곱셈 (0) | 2021.12.09 |