본문 바로가기

Coding Test

백준 14247 나무 자르기

https://www.acmicpc.net/problem/14247

#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;

int main() {

    ios::sync_with_stdio(false);
    cin.tie(NULL);
    cout.tie(NULL);

    long long n, ans = 0;
    vector<pair<long long, long long>> tree;


    cin >> n;

    tree.resize(n);


    for (int i = 0; i < n; i++) {
        cin >> tree[i].second;
    }

    for (int i = 0; i < n; i++) {
        cin >> tree[i].first;
    }

    sort(tree.begin(), tree.end());

    for (int i = 0; i < n; i++) {
        ans += tree[i].second + tree[i].first * i;
    }

    cout << ans;


    return 0;
}

1. 문제

나무 n개의 초기 길이와 하루동안 자라는 길이가 주어진다. 매일 나무를 한 그루씩 잘라 얻으려고 할 때, 얻을 수 있는 최대 나무의 길이를 구하라.

2. 풀이

 그리디하게 풀 수 있는 문제이다. 나무는 자르지 않으면 계속 자라므로, 긴 나무를 오래 둘 수록 그 길이는 많이 증가한다. 즉, 짧은 나무를 일찍 자르고, 긴 나무를 늦게 자르면 최댓값을 구할 수 있다.

    for (int i = 0; i < n; i++) {
        cin >> tree[i].second;
    }

    for (int i = 0; i < n; i++) {
        cin >> tree[i].first;
    }

    sort(tree.begin(), tree.end());

pair로 초기 길이와 증가 길이를 입력받는다. 증가하는 길이를 기준으로 정렬할 것이므로 이를 first로 놓고, 정렬한다.

    for (int i = 0; i < n; i++) {
        ans += tree[i].second + tree[i].first * i;
    }

i+1일에 자른 나무의 길이는 나무의 초기 길이+하루에 증가하는 길이*i이므로 이를 적용하여 계산한다. 계산 결과를 출력하면 정답을 구할 수 있다.

'Coding Test' 카테고리의 다른 글

백준 1455 뒤집기 2  (0) 2024.07.07
백준 14400 편의점 2  (0) 2024.07.06
백준 1946 신입 사원  (0) 2024.07.04
백준 1092 배  (1) 2024.06.30
백준 2212 센서  (0) 2024.06.29