https://www.acmicpc.net/problem/6236
6236번: 용돈 관리
문제 현우는 용돈을 효율적으로 활용하기 위해 계획을 짜기로 하였다. 현우는 앞으로 N일 동안 자신이 사용할 금액을 계산하였고, 돈을 펑펑 쓰지 않기 위해 정확히 M번만 통장에서 돈을 빼서 ��
www.acmicpc.net
인출하는 돈의 양을 1~1000000정도 범위로 설정해 놓고, 이분 탐색을 이용해 문제를 해결하자. while 문 내부에 구현할 시뮬레이션에서 현재 가지고 있는 돈와 인출 조건을 만족시키면서 M보다 작은 cnt를 계속 찾으면 쉽게 해결할 수 있다.
#include <cstdio>
#include <algorithm>
using namespace std;
int main(void){
int N, M, Money[100001], maxi=-1;
scanf("%d %d",&N,&M);
for(int i=0; i<N; i++){
scanf("%d",&Money[i]);
maxi = max(Money[i], maxi);
}
int left = maxi, right = 1000000, mid, save, money, cnt;
while(left <= right){
money = 0;
cnt = 0;
mid = (left + right)/2;
for(int i=0; i<N; i++){
if(money < Money[i]){
money = 0;
money += mid;
cnt++;
money -= Money[i];
}
else{
money -= Money[i];
}
}
if(cnt<=M){
save = mid;
right = mid - 1;
}
else{
left = mid + 1;
}
}
printf("%d",save);
}
'알고리즘 문제' 카테고리의 다른 글
[C/C++ 백준 2022번] 사다리 (Silver 1) (0) | 2020.08.20 |
---|---|
[C/C++ 백준 2343번] 기타 레슨 (Silver 1) (0) | 2020.08.19 |
[C/C++ 백준 1474번] 밑 줄 (Silver 2) (0) | 2020.08.18 |
[C/C++ 백준 2110번] 공유기 설치 (Silver 2) (0) | 2020.08.17 |
[C/C++ 백준 2805번] 나무자르기 (Silver 3) (0) | 2020.08.17 |