문제 풀이

[c++] 백준 1041 주사위

미분당한 적분상수 2023. 3. 6. 16:57

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

 

1041번: 주사위

첫째 줄에 N이 주어진다. 둘째 줄에 주사위에 쓰여 있는 수가 주어진다. 위의 그림에서 A, B, C, D, E, F에 쓰여 있는 수가 차례대로 주어진다. N은 1,000,000보다 작거나 같은 자연수이고, 쓰여 있는 수

www.acmicpc.net

자료 범위만 조심하자

#include<bits/stdc++.h>
using namespace std;
#define INF 987654321
vector<long long> plain;
long long Sum=0, second_Min=INF;
long long cArr[2] = { 0, };
//이웃한 두 면의 경우가 많아서, 조합으로 구했다.
void combination(long long depth, long long next){
    if(depth == 2){
        bool flag = 0;
        for(long long i=1; i<=3; i++)
            if(cArr[0] == i && cArr[1] == 7-i) // 이웃하지 않을 떄 패스
                flag=1;
        if(!flag){// (이웃하면)
            second_Min = min(plain[cArr[0]-1]+plain[cArr[1]-1], second_Min);
        }
        return;
    }
    for(long long i = next; i <= 6; i++){
        cArr[depth] = i;
        combination(depth + 1, i + 1);
    }
}
//세개의 면이 보이는 조각의 최소 구하기
//  노가다로 했다.
long long third(){
    long long a=plain[0],
        b=plain[1],
        c=plain[2],
        d=plain[3],
        e=plain[4],
        f=plain[5];
    long long first_Min=INF;
    first_Min = min(a+b+d, first_Min);
    first_Min = min(a+b+c, first_Min);
    first_Min = min(a+c+e, first_Min);
    first_Min = min(a+e+d, first_Min);
    first_Min = min(f+b+d, first_Min);
    first_Min = min(f+b+c, first_Min);
    first_Min = min(f+c+e, first_Min);
    first_Min = min(f+e+d, first_Min);
    return first_Min;
}
//한개의 면이 보이는 조각의 최소 구하기
//  주사위에 쓰여진 수 중 최소 리턴
long long first(){
    vector<long long> face;
    face = plain;
    sort(face.begin(), face.end());
    return face[0];
}
int main(){
    ios::sync_with_stdio(0);
    cin.tie(0);
    long long n; cin>>n;
    for(long long i=0; i<6; i++){
        long long k; cin>>k;
        Sum += k;
        plain.push_back(k);
    }
    combination(0,1);
    long long t = third(), //세개의 면이 보이는 조각의 최소
              s = second_Min, //두개의 면이 보이는 조각의 최소
              f = first(); // 한개의 면이 보이는 조각의 최소
    sort(plain.begin(), plain.end());
    if(n == 1)// n=1일떄는 조각 하나이므로 제일 값이 큰 면을 바닥으로
        cout << Sum - plain[5];
    else
        cout << (4)*t + ((n-1)*4 + (n-2)*4)*s + ((n-1)*(n-2)*4 + (n-2)*(n-2))*f;
    return 0;
}