PS

BOJ 6236 : 용돈 관리

lickelon 2024. 12. 18. 22:36
  • 문제 링크 : boj.kr/6236
  • 난이도 : S1
  • 태그 : 이분 탐색

코드

#include <bits/stdc++.h>

#define all(x) (x).begin(), (x).end()

#define INF 0x7FFFFFFF

using namespace std;

using ll = long long;
using ld = long double;
using pii = pair<int,int>;
using pll = pair<ll, ll>;

int main()
{
    ios::sync_with_stdio(0);
    cin.tie(0); cout.tie(0);

    int n, m;
    cin >> n >> m;
    vector<int> arr(n);
    for(auto &e : arr) cin >> e;

    int l = 1, r = 1e9+1;
    int ans = INF;
    while(l+1 < r) {
        int mid = (l+r)/2;

        int cnt = 1, curr = mid;
        for(auto e : arr) {
            if(e > mid) {
                cnt = INF;
                break;
            }
            if(curr < e) {
                cnt++;
                curr = mid;
            }
            curr -= e;
        }
        if(cnt > m) l = mid;
        if(cnt <= m){
            r = mid;
            ans = min(ans, mid);
        }
    }
    cout << ans;

    return 0;
}

풀이

mid를 lo로 할지 hi로 할지 잘 생각해서 풀어야 한다.

mid와 lo의 결과가 같다면 lo = mid, mid와 hi의 결과가 같다면 hi = mid이다.

728x90

'PS' 카테고리의 다른 글

BOJ 11055 : 가장 큰 증가하는 부분 수열  (0) 2024.12.20
BOJ 11568 : 민균이의 계략  (0) 2024.12.19
BOJ 9693 : 시파르  (0) 2024.12.17
BOJ 20006 : 랭킹전 대기열  (0) 2024.12.16
BOJ 2942 : 퍼거슨과 사과  (1) 2024.12.15