-
[6236] 용돈 관리BOJ 2022. 3. 2. 20:48
https://www.acmicpc.net/problem/6236
6236번: 용돈 관리
현우는 용돈을 효율적으로 활용하기 위해 계획을 짜기로 하였다. 현우는 앞으로 N일 동안 자신이 사용할 금액을 계산하였고, 돈을 펑펑 쓰지 않기 위해 정확히 M번만 통장에서 돈을 빼서 쓰기로
www.acmicpc.net
i일에 사용할 돈을 a[i]라고 입력받은 뒤, 초기에 가진 돈(cur)을 하나의 mid에 대해서
cur-a[i]가 음수인 경우에는 남은 돈을 통장에 넣고, mid만큼 통장에서 인출한다.
인출한 횟수(cnt)를 매번 기록해 두었다가, n번에 걸친 시뮬레이션이 끝나면
cnt<=m으로 mid가 정답의 가능성이 존재하는지를 판단한다.
#include <bits/stdc++.h>using namespace std;#ifdef ONLINE_JUDGEconstexpr bool local = false;#elseconstexpr bool local = true;#endifusing ll = long long;using pi = pair<ll, ll>;int n, m, ans;vector<int> a;bool f(int mid) {int i, cur = 0, cnt = 0;for (i = 0; i < n; i++) {if (mid - a[i] < 0) return false;if (cur - a[i] < 0) {cur = mid - a[i];cnt++;} else {cur -= a[i];}}return cnt <= m;}int main(void) {if (!local) ios_base::sync_with_stdio(0), cin.tie(0);cin >> n >> m;int i;a.resize(n);for (i = 0; i < n; i++) cin >> a[i];int s = 0, e = (int)(1e9 + 0.5);ans = e;while (s <= e) {int mid = s + e >> 1;bool ret = f(mid);if (ret == true) {ans = min(mid, ans);e = mid - 1;} elses = mid + 1;}cout << ans;return 0;}
'BOJ' 카테고리의 다른 글
[15684] 사다리 조작 (0) 2022.03.06 [15810] 풍선 공장 (0) 2022.03.04 [2512] 예산 (0) 2022.03.02 [4195] 친구 네트워크 (0) 2022.03.02 [1976] 여행 가자 (0) 2022.03.02