안녕하세요. 오늘은 맥주 냉장고를 만들 거예요.

문제

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

아이디어

a를 확정시키면 b,c도 확정시킬 수 있습니다.
2(ab+bc+ac)의 값이 최소가 되어야하는데 a가 확정되면 2a(b+c)+2bc의 값이 최소가 되지만 bc도 확정이므로 b+c가 최소이면 됩니다.
즉, 모든 a에 대해서 위를 실행해주면 됩니다.

일반성을 잃지않고(?)
a<=b<=c입니다.

소스코드

#include <iostream>
#include <algorithm>
#include <tuple>
#define ll long long
using namespace std;

ll N;
tuple<ll, ll, ll, ll> mn(ll x)
{
    ll y = 1;
    for (ll i = x; i * i <= N / x; i++)
        if ((N / x) % i == 0)
            y = i;
    ll z = N / x / y;

    return { x,y,z,2 * (x * y + y * z + x * z) };
}

int main()
{
    ios_base::sync_with_stdio(false); cin.tie(NULL);
    cin >> N;
    ll ans = 1e18;
    tuple <ll, ll, ll, ll> res;

    for (ll i = 1; i * i * i <= N; i++)
        if (N % i == 0)
            if (ans > get<3>(mn(i)))
            {
                ans = get<3>(mn(i));
                res = mn(i);
            }
    
    cout << get<0>(res) << ' ' << get<1>(res) << ' ' << get<2>(res);
}


감사합니다.

0개의 댓글