코드포스(CodeForce)
Codeforces Round #460 (Div. 2) - B. Perfect Number
cepiloth
2018. 8. 17. 17:39
반응형
1. 문제
2. 알고리즘
키워드 - 구현
* 어설픈 해석
자릿수의 합이 정확히 10 인 경우에만 양의 정수를 완전하다고 간주합니다. 양의 정수 k가 주어지면 작업은 k 번째 가장 작은 양의 정수를 구하라.
* 문제 풀이
19 라는 숫자가 있다면 각 자리수 별로 1 + 9 는 10 이 된다. 문제에서 요구 하는 사항은 자리수에 합이 10이다.
1081 또한 1 + 8 + 1 = 10 임으로 perfect number 가 된다.
모든 10 이 되는 경우의 수를 dp 배열에 담아 미리 계산 해놓고 실제 n 이 입력되는 경우에 인덱스를 찾도록 했다. 시간복잡도는 생각하지 않고 넉넉히 계산했다.
3. 코드
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 | #include <iostream> #include <algorithm> // min #include <math.h> using namespace std; long long dp[100005] = { 0, }; bool check(int n) { long long sum = 0; while (n > 0) { long long cand = n % 10; sum += cand; n /= 10; } return sum == 10; } int main() { int k; cin >> k; dp[0] = 0; int count = 1; for (long long i = 19; i < 100005 * 200; i++) { if (check(i)) { dp[count] = i; count++; } } cout << dp[k] << endl; return 0; } | cs |
반응형