[ 백준 ] 11508 / 2+1 세일

金弘均·2021년 9월 15일
0

Baekjoon Online Judge

목록 보기
59/228
post-thumbnail

# Appreciation

/*
 * Problem :: 11508 / 2+1 세일
 *
 * Kind :: Greedy
 *
 * Insight
 * - 최소비용으로 유제품사기
 *   + 최대한 3개씩 한 번에 사기
 *     # 무료로 지불하는 제품 가격을 최대화하기
 *       -> 가장 비싼거 3개 사는 것이
 *          무료로 지불하는 제품 가격을 최대화 하는 방법인것 같은데...?
 *          이제 남은 유제품들 중에서 가장 비싼거 3개 사고...
 *          이렇게 반복하면 되지 않을까?
 *
 * Point
 * - 즉, 내림차순으로 정렬하고
 *   앞에서 부터 순서대로 3개씩 묶어서 사면
 *   3번째 유제품마다 무료로 살 수 있다
 *   + sum(C[3], C[6], C[9], ...)
 *     순열 : 3, 6, 9, ...
 *     개수 : N/3
 *     # 이는 문제의 규칙을 이용해서 나올 수 있는
 *       무료로 살 수 있는 유제품들의 어떤 순열들보다
 *       가격의 합이 크거나 같다!
 *
 * - 모든 유제품들의 가격을 더 한후
 *   3번째 유제품의 가격을 빼주자
 *   + 모든 유제품들의 가격의 합은 2^31-1 보다 클 수 있으니
 *     long 자료형을 사용하자 :)
 */

# Code

//
//  BOJ
//  ver.C++
//
//  Created by GGlifer
//
//  Open Source

#include <iostream>
#include <numeric>

using namespace std;

#define endl '\n'

// Set up : Global Variables
/* None */

// Set up : Functions Declaration
/* None */


int main()
{
    // Set up : I/O
    ios::sync_with_stdio(false);
    cin.tie(nullptr);

    // Set up : Input
    int N; cin >> N;
    int C[N];
    for (int i=0; i<N; i++)
        cin >> C[i];

    // Process
    sort(C, C+N, greater<>()); /* 유제품 가격 내림차순 정렬 */
    long ans = accumulate(C, C+N, (long)0); /* 모든 유제품들의 가격의 합 */
    for(int i=2; i<N; i+=3) {
        ans -= C[i]; /* 3번째 유제품 마다 무료로 살 수 있음 */
    }

    // Control : Output
    cout << ans << endl;
}

// Helper Functions
/* None */
profile
이런 미친 게임을 봤나! - 옥냥이

0개의 댓글