반응형
문제 출처 :
https://www.acmicpc.net/problem/2643
알고리즘 분석 :
문제 해결에 필요한 사항
1. Sort
2. Lis Algorithm
http://www.crocus.co.kr/429 다음 링크를 통해 lis 알고리즘의 다른 문제를 확인해 볼 수 있다.
위의 링크에는 lis에 대해 조금 더 설명을 해 두었다.
이 코드는
입력을 받을 때 부터, x보다 y가 길이가 더 길면 즉, 가로보다 세로가 길면 종이를 돌린다 생각하여
가로가 무조건 더 길게 되도록 하여 값을 저장시킨다.
그리고 가로 크기 순서대로 오름차순 정렬을 한 후,
가로에 의해 정렬된 세로만을 확인하여 lis 알고리즘을 이용하면 정답을 도출해 낼 수 있다.
lis알고리즘은 부분 증가 수열에서 유용하다.
소스 코드 :
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 <cstdio> #include <algorithm> using namespace std; struct point { int x, y; }; point p[100000]; int lis[100001]; int arr[100001]; bool comp(point const& a, point const& b) { if (a.x == b.x) return a.y < b.y; return a.x < b.x; } int _lower_bound(int start, int end, int *arr, int target) { int mid; while (end - start > 0) // 주어진 범위[start,end]에서 탐색하도록 한다. start == end이면 반복 종료 { mid = (start + end) / 2; // 주어진 범위의 중간 위치를 계산한다 if (arr[mid] <= target) // 찾고자 하는 값보다 작으면 오른쪽으로 한 칸만 더 시작 구간 갱신 start = mid + 1; else // 찾고자 하는 값보다 크면 거기까지 끝 구간 갱신 end = mid; } return end + 1; // 찾는 구간에 없는 경우 가장 마지막 +1 위치 전달 } int main() { int i, n, x, y,j=0; scanf("%d", &n); for (i = 0; i<n; ++i) { scanf("%d%d", &x, &y); if (y > x) p[i] = { y,x }; else p[i] = { x, y }; } sort(p, p + n, comp); for (int t = 0; t < n; t++) arr[t] = p[t].y; int cnt = 0; i = 0; lis[i] = arr[i]; i++; while (i < n) { // lis의 가장 큰 값보다 더 큰값이 들어오면 if (lis[j] <= arr[i]) { lis[j + 1] = arr[i]; j++; } else { int ans = _lower_bound(0, j, lis, arr[i]); lis[ans - 1] = arr[i]; } i++; } printf("%d", j+1); return 0; } // This source code Copyright belongs to Crocus // If you want to see more? click here >> | Crocus |
반응형
'Applied > 알고리즘 문제풀이' 카테고리의 다른 글
[13567번] Robot (0) | 2016.11.07 |
---|---|
[13414번] 수강신청 (0) | 2016.11.06 |
[1120번] 문자열 (0) | 2016.11.06 |
[10824번] 네 수 (0) | 2016.11.03 |
[13420번] 사칙연산 (0) | 2016.11.03 |