반응형
문제 출처 :
https://www.acmicpc.net/problem/1193
알고리즘 분석 :
문제 해결에 필요한 사항
1. 규칙 찾기
2. 일반항 구하기(계차수열)
아래 그림을 자세히 보면
1/1을 기준으로 ↘ 방향으로 보면 항상 규칙이 있다.
1 + 2n(n-1)번째에 항상 값이 존재한다.
예를들어 2/2는 1 + 2*2(1) 즉, 처음부터 시작하면 5번만에 도착할 수 있다.
이러한 방식으로 k번째 값이 무엇인지 궁금할 때
k보다 크거나 같은 값을 구해서 그 값을 기준으로 역행하면 답을 찾을 수 있다.
물론 이렇게 하면 조금 더 빠를것이다.
k보다 크거나 같고 k보다 작거나 같은 값을 구해서 그 두 값중 k가 가까운 쪽의 값을 선택하여 그 부분부터 k를 찾아간다면
좀 더 빠를것이다.
소스 코드 :
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 | #include <iostream> using namespace std; int main() { int n; int ans; int bunmo = 0, bunja = 0; int flag = 0; cin >> n; for (int i = 1;; i++) { if (n <= 1 + 2 * i*(i - 1)) { ans = i; break; } } // 분자 분모 초기화 bunmo = ans; bunja = ans; // 지금부터 ans에는 // 현재 분수에 해당하는 번호가 들어간다 ans = 1 + 2 * ans*(ans - 1); while (1) { // ans가 n을 찾아갔을 때 if (n == ans) break; // 역순회해야 하니 왼쪽밑으로 먼저 돈다. if(flag == 0) { if (bunmo == 1) { bunja--; flag = 1; } else { bunmo--; bunja++; } } else if (flag == 1) { if (bunja == 1) { bunmo--; flag = 0; } else { bunmo++; bunja--; } } ans--; } cout << bunja << "/" << bunmo; } // This source code Copyright belongs to Crocus // If you want to see more? click here >> | Crocus |
반응형
'Applied > 알고리즘 문제풀이' 카테고리의 다른 글
[10448번] 유레카 이론 (0) | 2016.11.02 |
---|---|
[11051번] 이항 계수 2 (2) | 2016.11.02 |
[1111번] IQ Test (2) | 2016.11.02 |
[13419번] 탕수육 (0) | 2016.10.31 |
[13417번] 카드 문자열 (Deque 활용) (3) | 2016.10.31 |