사용할 수 있는 연산자의 개수를 하나씩 감소시켜보면서 DFS를 수행해주면된다.
사용중 처리를 연산자의 수를 조절해줌으로써 해준다.
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 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 | #include<vector> #include<iostream> #include<set> #include<climits> using namespace std; int n; long long Min = LONG_MAX; long long Max = LONG_MAX * -1; vector<int> opr; vector<int> arr; set<vector<int> > st; int num[13]; bool used[13]; void pick(int k) { if (k == n - 1) { long long res = num[0]; for (int i = 0; i < arr.size(); i++) { int cmd = arr[i]; if (cmd == 0) res += num[i + 1]; else if (cmd == 1) res -= num[i + 1]; else if (cmd == 2) res *= num[i + 1]; else res /= num[i + 1]; } if (res < Min) Min = res; if (res > Max) Max = res; //st.insert(arr); return; } for (int i = 0; i < 4; i++) { if (opr[i] > 0) { arr[k] = i; opr[i]--; pick(k + 1); opr[i]++; } } } int main(void) { ios::sync_with_stdio(false); cin.tie(0); int T; cin >> T; for (int tc = 1; tc <= T; tc++) { cin >> n; //더하기, 뺴기, 곱하기, 나누기 for (int i = 0; i < 4; i++) { int cnt; cin >> cnt; opr.push_back(cnt); } for (int i = 0; i < n; i++) cin >> num[i]; for (int i = 0; i < n - 1; i++) arr.push_back(0); pick(0); long long dif = Max - Min; if (dif < 0) dif *= -1; cout << "#" << tc << ' ' << dif << '\n'; Min = LONG_MAX; Max = LONG_MAX * -1; opr.clear(); st.clear(); arr.clear(); } return 0; } | cs |
'알고리즘 문제 풀이 > 삼성 SW Expert Academy' 카테고리의 다른 글
SWEA 1953: 탈주범 검거 (C++) (0) | 2019.10.13 |
---|---|
SWEA 5644: 무선 충전 (C++) (0) | 2019.10.09 |
SWEA 1952: 수영장 (C++) (0) | 2019.10.04 |
SWEA 4013번: 특이한 자석 (C++) (0) | 2019.10.03 |
SWEA 4012번: 요리사 (C++) (0) | 2019.10.03 |