안녕하세요. 오늘은 맥주 냉장고를 만들 거예요.
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);
}
감사합니다.