N개의 수들이 들어오면 N-1 개의 주어진 +,-,*,/ 연산자로 적절히 배열해 최댓값과 최솟값을 구하는 문제다. 수들의 배열은 바뀌지 않는다.
시간 복잡도는 N-1개의 연산자들을 나열하는 것이므로 (N-1)! 이 되겠다. N의 최댓값이 11이므로 N-1은 10 즉 ,10! = 3628800 이다.
완전탐색을 이용해 풀었다. 주의할 점은 최솟값이 음수가 나올 수 있다는 점이다. 이 점 때문에 몇번이나 틀렸다...
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 | #include <iostream> #include <vector> #include <cmath> using namespace std; int N; int a, b; void solve(vector <int> &num, int pl, int mi, int mul, int div, int index, int cal) { if (index == N) { if (a > cal) { a = cal; } if (b < cal) { b = cal; } return; } if (pl > 0) { solve(num, pl - 1, mi, mul, div, index + 1, cal + num[index]); } if (mi > 0) { solve(num, pl, mi-1, mul, div, index + 1, cal - num[index]); } if (mul > 0) { solve(num, pl, mi, mul-1, div, index + 1, cal * num[index]); } if (div > 0) { solve(num, pl, mi, mul, div - 1, index + 1, cal / num[index]); } } int main() { cin >> N; vector <int> num(N); for (int i = 0; i < N; i++) { cin >> num[i]; } int pl; int mi; int mul; int div; cin >> pl >> mi >> mul >> div; a = 987654321; b = -987654321; solve(num, pl, mi, mul, div, 1,num[0]); cout << b << '\n' << a << '\n'; return 0; } | cs |
반응형
'Computer Science > Algorithm' 카테고리의 다른 글
[BOJ 14889] 스타트와 링크 (0) | 2018.10.17 |
---|---|
[BOJ 14891] 톱니바퀴 (0) | 2018.10.17 |
[BOJ 14501] 퇴사 (0) | 2018.10.17 |
삼성 SWEA 점심 식사시간 (0) | 2018.10.17 |
[BOJ 16137] 견우와 직녀 (0) | 2018.10.16 |