September 24, 2021
오늘 동빈이는 여행 가신 부모님을 대신해서 떡집 일을 하기로 했습니다. 오늘은 떡볶이 떡을 만드는 날입니다. 동빈이네 떡볶이 떡은 재밌게도 떡볶이 떡의 길이가 일정하지 않습니다. 대신에 한 봉지 안에 들어가는 떡의 총 길이는 절단기로 잘라서 맞춰줍니다.
절단기에 높이(H)를 지정하면 줄지어진 떡을 한 번에 절단합니다. 높이가 H보다 긴 떡은 H 위의 부분이 잘릴 것이고, 낮은 떡은 잘리지 않습니다.
예를 들어 높이가 19, 14, 10, 17cm인 떡이 나란히 있고 절단기 높이를 15cm로 지정하면 자른 뒤 떡의 높이는 15, 14, 10, 15cm가 될 것입니다. 잘린 떡의 길이는 차례대로 4, 0, 0, 2cm입니다. 손님은 6cm만큼의 길이를 가져갑니다.
손님이 왔을 때 요청한 총 길이가 M일 때 적어도 M만큼의 떡을 얻기 위해 절단기에 설정할 수 있는 높이의 최댓값을 구하는 프로그램을 작성하세요.
2초
128MB
첫째 줄에 떡의 개수 N과 요청한 떡의 길이 M이 주어집니다. (1≤N≤1,000,000, 1≤M≤2,000,000,000)
둘째 줄에는 떡의 개별 높이가 주어집니다. 떡 높이의 총합은 항상 M이상이므로, 손님은 필요한 양만큼 떡을 사갈 수 있습니다. 높이는 10억보다 작거나 같은 양의 정수 또는 0입니다.
적어도 M만큼의 떡을 집에 가져가기 위해 절단기에 설정할 수 있는 높이의 최댓값을 출력합니다.
#include <stdio.h>
using namespace std;
int N, M, minVal = 1000000000, maxHeight;
int cakeLen[1000000];
int sliceCake(int height) {
int sum = 0;
for (int i = 0; i < N; ++i) {
int slicedLen = cakeLen[i] - height;
if (slicedLen > 0) {
sum += slicedLen;
}
}
return sum;
}
void findHeight(int start, int end) {
int mid = (start + end) / 2, slicedLen;
if (start > end) return;
slicedLen = sliceCake(mid);
if (slicedLen < M) {
findHeight(start, mid - 1);
} else {
minVal = mid;
findHeight(mid + 1, end);
}
}
int main() {
int tmp;
scanf("%d %d", &N, &M);
for (int i = 0; i < N; ++i) {
scanf("%d", &tmp);
cakeLen[i] = tmp;
if (tmp > maxHeight) {
maxHeight = tmp;
}
}
findHeight(0, maxHeight - 1);
printf("%d", minVal);
return 0;
}
from symbol import sliceop
N, M = map(int, input().split())
cake_list = list(map(int, input().split()))
max_in_list = max(cake_list)
min_val = 0
def slice_cake(h):
sliced_height = 0
for height in cake_list:
if (height > h):
sliced_height += height - h
return sliced_height
def binary_search(start, end):
if (start > end):
return None
global min_val
mid = (start + end) // 2
sliced_height = slice_cake(mid)
if (sliced_height == M):
min_val = mid
elif (sliced_height > M):
min_val = mid
binary_search(mid + 1, end)
else:
binary_search(start, mid - 1)
binary_search(0, max_in_list)
print(min_val)