문제 링크 : https://www.acmicpc.net/problem/6236
6236번: 용돈 관리
문제 현우는 용돈을 효율적으로 활용하기 위해 계획을 짜기로 하였다. 현우는 앞으로 N일 동안 자신이 사용할 금액을 계산하였고, 돈을 펑펑 쓰지 않기 위해 정확히 M번만 통장에서 돈을 빼서 쓰기로 하였다. 현우는 통장에서 K원을 인출하며, 통장에서 뺀 돈으로 하루를 보낼 수 있으면 그대로 사용하고, 모자라게 되면 남은 금액은 통장에 집어넣고 다시 K원을 인출한다. 다만 현우는 M이라는 숫자를 좋아하기 때문에, 정확히 M번을 맞추기 위해서 남은 금액이 그날
www.acmicpc.net
문제 설명
1. 하루에 사용하는 금액과 돈을 인출 할수있는 횟수가 주어진다.
2. 인출 횟수를 꼭 맞추고 하루에 돈 소비량을 맞출수있는 최소 인출금액을 구하면된다
주의사항 : 인출금액은 고정 , 만약 돈이남았는데 오늘 돈 소비량보다 작다-> 돈을 입금후 다시 인출.
알고리즘
이분탐색으로 인출금액을 찾아낸다.
최소 인출금액 (lo) : 하루 소비금액중 최대 금액 ; (주의)
hi 는 INF로
while 안을 살펴보면 , 돈을 쓰다가 음수가 나오면 cnt ++ 해서
cnt가 m보다 크다 그럼 lo 를 mid+1 로
cnt가 m보다 작다 그럼 hi 를 mid-1 로.
마지막에 mid 출력.
코드
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 | #include<iostream> #include<algorithm> using namespace std; int main() { int N, M, lo = 0; cin >> N >> M; int arr[100001]; int hi = 0; for (int i = 0; i < N; i++) { cin >> arr[i]; lo = max(lo, arr[i]); hi = hi + arr[i]; } int mid = 0; //이분 탐색 while (lo <= hi) { mid = (lo + hi) / 2; int cnt = 1; int money = mid; for (int i = 0; i < N; i++) { money = money - arr[i]; if (money <= 0) { money = mid - arr[i]; cnt++; } } if (cnt > M) lo = mid + 1; else hi = mid - 1; } cout << mid; } | cs |
'c++ > 백준' 카테고리의 다른 글
백준 9663번 : N-Queen (0) | 2020.04.17 |
---|---|
백준 1920번 : 수 찾기 (0) | 2020.04.17 |
백준 1992번: 쿼드트리 (0) | 2020.04.16 |
백준 1759번 : 암호만들기 (0) | 2020.04.16 |
백준 14499번 : 주사위 굴리기 (0) | 2020.04.16 |
![ariz1623](https://t1.daumcdn.net/tistory_admin/static/manage/images/r3/default_L.png)
백준 6236번: 용돈 관리