17. 카운트 다운

aj4941·2023년 9월 4일
0

https://school.programmers.co.kr/learn/courses/30/lessons/131129

pair를 대입하는 것은 ret = pii(x, y) 형태로 접근해도 문제가 없으나 더할 때는 pii(x, y) + pii(r, c) 이런식으로 계산하면 오류가 나므로 first, second를 따로 더해줘야 한다.
비교할 때 역시 pii(x, y) < pii(r, c) 로 적용할 수 없으므로 따로 calc 함수를 두었다.

#include <bits/stdc++.h>
using namespace std;
typedef pair<int, int> pii;
const int N = 100002;
pii dp[N];
int val[4] = { 1, 2, 3, 50 };

bool calc(pii &a, pii &b) // a < b ?
{
    if (a.first != b.first)
        return a.first > b.first;
    
    return a.second < b.second;
}

pii solve(int v)
{
    pii &ret = dp[v];
    if (ret.first != -1) return ret;
    ret = pii(1e9, -1e9);
    if (v == 0) return ret = pii(0, 0);
    
    for (int c = 0; c < 4; c++)
    {
        for (int p = 1; p <= 20; p++) 
        {
            int value = (c != 3) ? val[c] * p : 50;
            if (v - value >= 0)
            {
                pii res = solve(v - value);
                res.first++;
                if (c == 0 || c == 3) res.second++;
                if (calc(ret, res))
                    ret = res;
            }
        }
    }
    
    return ret;
}

vector<int> solution(int t) 
{   
    for (int i = 0; i < N; i++)
        dp[i] = pii(-1, -1);
    
    pii res = solve(t);
    
    return { res.first, res.second };
}
profile
안녕하세요 aj4941 입니다.

0개의 댓글