ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 백준 2343 (기타 레슨) c++
    백준 문제 2022. 2. 16. 15:51
    728x90

    문제

     

    2343번: 기타 레슨

    강토는 자신의 기타 강의 동영상을 블루레이로 만들어 판매하려고 한다. 블루레이에는 총 N개의 강의가 들어가는데, 블루레이를 녹화할 때, 강의의 순서가 바뀌면 안 된다. 순서가 뒤바뀌는 경

    www.acmicpc.net

    n개의 강의를 m개의 블루레이에 담으려 하는데 블루레이의 최소크기를 출력하면 되는 문제입니다.

    예를들어 n이 9이고 m이 3이면 

    9개의 강의 {1, 2, 3, 4, 5, 6, 7, 8, 9} 를 담으려 한다면 블루레이의 크기는 17이 최소입니다.

    비디오는 순서대로 연속적으로 블루레이에 담아야합니다.

     

    블루레이의 크기가 클 수록 모든 비디오를 담을 수 있습니다. 

    블루레이의 특정크기(k)에 대해서 레슨이 모두 저장되는가?

    저장된다면, k보다 큰 크기에 대해서도 항상가능합니다.

     

    따라서 parametric search를 이용해서 문제를 해결하였습니다.

    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
    int s = *max_element(arr, arr+n);
    int e = 1000000000;
    while (s < e) {
        int m = (s + e) / 2;
        if (search(m)) {
            answer = min(answer, m);
            e = m;
        }
        else s = m + 1;
    }
    cout << answer;
     
     
    bool search(int key) {
        int ans = 0;
        int cnt = 1;
        for (int i = 0; i < n; i++) {
            if (ans + arr[i] > key) {
                cnt++;
                ans = 0;
            }
            ans += arr[i];
        }
        if (cnt <= m)return true;
        return false;
    }
    cs

    먼저 start는 주어진 강의중 제일 큰 크기가 들어갔습니다. 

    아무리 블루레이가 작아도 가장 큰 강의보다 크기 때문입니다.

     

    14번쨰 줄을 보면 이제 강의를 차례대로 확인하면서 블루레이에 넣을 수 있는지 없는지 확인합니다.

    ans변수는 강의의 누적합을 저장하면서 key(블루레이의 크기) 보다 작으면 계속 해서 누적합을 저장하고

    key보다 작으면 더이상 블루레이에 강의를 넣을 수 없다는 의미이므로 cnt를 1늘려주고 ans는 다시 0이 되어

    다음 강의를 누적합으로 저장합니다.

     

    24번째 줄을 보면 cnt(블루레이의 갯수)가 m보다 작거나 같다는 의미는 현재 블루레이의 크기가 여유 있다는

    의미 이므로 true를 return합니다.


    전체 코드입니다.

    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
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    #include<iostream>
    #include<algorithm>
    #include<climits>
    #include<string>
    #include<vector>
    #include<queue>
    #include<stack>
    #include<deque>
    #include<cmath>
    #include<time.h>
    #include<cstring>
    #include<cmath>
    #include<cstring>
    #include<limits>
    #define inf INT_MAX
    using namespace std;
    using ll = long long;
    using ull = unsigned long long;
    int n, m, answer=1000000000;
    int arr[100001];
    bool search(int key);
    int main() {
        ios_base::sync_with_stdio(false), cin.tie(NULL), cout.tie(NULL);
        cin >> n >> m;
        for (int i = 0; i < n; i++)
            cin >> arr[i];
        //sort(arr, arr + n);
     
        int s = *max_element(arr, arr+n);
        int e = 1000000000;
        while (s < e) {
            int m = (s + e) / 2;
            if (search(m)) {
                answer = min(answer, m);
                e = m;
            }
            else s = m + 1;
        }
        cout << answer;
     
        return 0;
    }
    bool search(int key) {
        int ans = 0;
        int cnt = 1;
        for (int i = 0; i < n; i++) {
            if (ans + arr[i] > key) {
                cnt++;
                ans = 0;
            }
            ans += arr[i];
        }
        if (cnt <= m)return true;
        return false;
    }
     
    cs

    '백준 문제' 카테고리의 다른 글

    백준 1786 (찾기) c++  (0) 2022.02.18
    백준 1725 (히스토그램) c++  (0) 2022.02.17
    백준 2805 (나무 자르기) c++  (0) 2022.02.16
    백준 1992 (쿼드 트리) c++  (0) 2022.02.15
    백준 23742 (Player-based Team Distribution) c++  (0) 2022.02.15
Designed by Tistory.