#include <stdio.h> #include <iostream> using namespace std; // 백준문제 14888과 동일, oper의 크기와 visited의 크기만 늘려주면 됨 int num[15]; int oper[50]; int choice[15]; int visited[50]; int operCnt; int N; int pluss, minuss, multi, divide; long long Max = -1000000005; long long Min = 1000000005; long long cal() { long long val = num[0]; for(int i = 1; i <= N-1; i++) { if(choice[i] == 1) { val += num[i]; } else if(choice[i] == 2) { val -= num[i]; } else if(choice[i] == 3) { val *= num[i]; } else if(choice[i] == 4) { if(val >= 0) { val /= num[i]; } else { int temp = -val; temp /= num[i]; val = -temp; } } } return val; } void permutation(int cnt) { if(cnt == N) { long long val = cal(); if(val > Max) { Max = val; } if(val < Min) { Min = val; } return; } // 연산 중복 제거 int used[5] = {0}; for(int i = 1; i <= operCnt; i++) { if(visited[i] == 0 && used[oper[i]] == 0) { used[oper[i]] = 1; visited[i] = 1; choice[cnt] = oper[i]; permutation(cnt+1); visited[i] = 0; } } } int main(void) { // freopen("B15686_input.txt", "r", stdin); scanf("%d", &N); for(int i = 0; i < N; i++) { scanf("%d", &num[i]); } scanf("%d %d %d %d", &pluss, &minuss, &multi, ÷); // oper에 1(+), 2(-), 3(*), 4(/) 담아줌 -> 이걸로 순열 적용 for(int i = 0; i < pluss; i++) { oper[++operCnt] = 1; } for(int i = 0; i < minuss; i++) { oper[++operCnt] = 2; } for(int i = 0; i < multi; i++) { oper[++operCnt] = 3; } for(int i = 0; i < divide; i++) { oper[++operCnt] = 4; } permutation(1); cout << Max << "\n"; cout << Min << "\n"; return 0; } | cs |
'Baekjoon > BruteForce' 카테고리의 다른 글
[백준 15683] 감시 (순열) (C/C++) (★★★) (1) | 2019.11.21 |
---|---|
[백준 15684] 사다리 조작 (조합) (C/C++) (★★★) (2) | 2019.11.20 |
[백준 16198] 에너지 모으기 (순열) (C/C++) (★★) (0) | 2019.11.20 |
[백준 14502] 연구소 (조합) (C/C++) (★★) (0) | 2019.11.20 |
[백준 14888] 연산자 끼워넣기 (순열) (C/C++) (0) | 2019.11.20 |