https://www.acmicpc.net/problem/15668
0 ~ 9 까지 숫자 카드 스티커들을 한 번씩만 사용해 n = a + b 의 a와 b를 만들어야 한다.
여러 풀이 중에 내 생각에 제일 기똥찬 풀이는,
a와 b중에 작은 수를 b라고 하면, b의 가능 범위가 작아지므로, 완탐으로 때릴 수 있다는 것이다.
b에 스티커 5장을 쓰면 a도 5장이 되므로 b엔 최대 5장까지만 쓸 수 있다.
또한 b의 맨 앞자리는 끽 해야 8이므로, 1~87654가 b의 가능범위이다.
b가 정해지면 a도 정해지므로, 구만번 만에 풀리는 문제.
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 | #include <bits/stdc++.h> using namespace std; int n; bool func(int x, int& st) { while (x) { int tmp = (1 << (x % 10)); if (st & tmp) return false; st |= tmp; x /= 10; } return true; } int main() { cin >> n; for (int i = 1; i <= 87654 && i < n; ++i) { int used = 0; if (!func(i, used)) continue; if (!func(n - i, used)) continue; cout << n - i << " + " << i; return 0; } cout << -1; } | cs |
'알고리즘 > 미분류' 카테고리의 다른 글
백준) 16116 작은 큐브러버 (0) | 2018.10.01 |
---|---|
백준) 15957 음악 추천 (퇴고전) (0) | 2018.09.11 |
codeforces educational 50 round div2 참여기록 (0) | 2018.09.09 |
SCC 문제들! 백준) 2150, 4013, 4196 (0) | 2018.07.22 |
백준) 2512 예산 (0) | 2018.07.19 |