https://www.acmicpc.net/problem/1253
중복검사가 좀 짱나네요
O(N^2*lonN) 나오더라구요.
그래서 좀 깔끔하지 못하게 ban1,ban2,flag 삽입함
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 | #include <stdio.h> #include <algorithm> using namespace std; int num[2002]; int ans=0; bool flag; bool search(int ban1, int ban2, int target, int left, int right) { if (left > right) { return false; } int mid = (left + right) / 2; if (num[mid] == target) { if (flag&&((mid != ban1)&& (mid != ban2))) { ans++; flag = false; return true; } return search(ban1,ban2, target, left, mid - 1)+ search(ban1,ban2, target, mid + 1, right); } else if(num[mid]>target) { return search(ban1,ban2,target, left, mid - 1); } else { return search(ban1,ban2,target, mid + 1, right); } } int main() { int n; scanf("%d", &n); for (int i = 1; i <= n; i++) { scanf("%d", &num[i]); } sort(&num[1], &num[n+1]); for (int i = 1; i <= n; i++) { for (int j = 1; j <= n; j++) { if (i != j) { flag = true; if (search(i,j,num[i]-num[j],1,n)) { break; } } } } printf("%d
", ans); return 0; } | cs |
20ms 제법있던대 방법생각해봄
내 기억에 20ms는 N^2임
데이터가 정렬된 상태라는것이 힌트
근데 생각보다 빨리푸네 ㄷㄷㄷ 나 이거 몇시간 걸렸던거같은데
딱보니 이분탐색이라 ㅋㅋ n^2 나오는건 아직생각이 안나네염
최장증가수열 응용이 있나
카페에 오면 속도 빠르게 만드는 팁 있어.
양쪽에서 검색하는거 같은데 함해봄
난 슬라이딩 윈도우라고 부르긴 하는데 이게 따로 명칭이 있나 모르겠다