[C++]백준1041번 주사위
문제는 다음과 같다.
오늘은 백준1041번 주사위 문제를 풀어보도록 하자. 그리디 문제라기보다는 그냥 구현문제였다. 주사위가 탁자 위에 올라와있는 것을 생각하며 하나하나 구하면 된다.
면이 3개, 2개, 1개 보이는 것의 갯수를 각각 찾으면 된다.
[코드]
#include <iostream>
#include <algorithm>
using namespace std;
int main() {
ios::sync_with_stdio(false);
cin.tie(0);
long long unsigned N, three_picks = 987654321, two_picks = 987654321, one_pick = 987654321;
long long unsigned dice[6];
long long unsigned answer;
cin >> N;
for (int i = 0; i < 6; i++) cin >> dice[i];
three_picks = min(three_picks, dice[0] + dice[1] + dice[2]);
three_picks = min(three_picks, dice[0] + dice[1] + dice[3]);
three_picks = min(three_picks, dice[0] + dice[2] + dice[4]);
three_picks = min(three_picks, dice[0] + dice[3] + dice[4]);
three_picks = min(three_picks, dice[1] + dice[2] + dice[5]);
three_picks = min(three_picks, dice[1] + dice[3] + dice[5]);
three_picks = min(three_picks, dice[2] + dice[4] + dice[5]);
three_picks = min(three_picks, dice[3] + dice[4] + dice[5]);
two_picks = min(two_picks, dice[0] + dice[1]);
two_picks = min(two_picks, dice[0] + dice[2]);
two_picks = min(two_picks, dice[0] + dice[3]);
two_picks = min(two_picks, dice[0] + dice[4]);
two_picks = min(two_picks, dice[5] + dice[1]);
two_picks = min(two_picks, dice[5] + dice[2]);
two_picks = min(two_picks, dice[5] + dice[3]);
two_picks = min(two_picks, dice[5] + dice[4]);
two_picks = min(two_picks, dice[1] + dice[2]);
two_picks = min(two_picks, dice[1] + dice[3]);
two_picks = min(two_picks, dice[2] + dice[4]);
two_picks = min(two_picks, dice[3] + dice[4]);
for (int i = 0; i < 6; i++) one_pick = min(one_pick, dice[i]);
if (N == 1) {
sort(dice, dice + 6);
answer = dice[0] + dice[1] + dice[2] + dice[3] + dice[4];
cout << answer << '\n';
}
else if (N == 2) {
answer = three_picks * 4 + two_picks * 4;
cout << answer << '\n';
}
else {
answer = three_picks * 4 + two_picks * 4 * (N - 1) + two_picks * (N - 2) * 4 + one_pick * (N - 2) * (N - 2) * 5 + one_pick * (N - 2) * 4;
cout << answer << '\n';
}
return 0;
}