$O(n\lg n)$
먼저 l[i]를 정렬한다.
처음 i=0, j=n-1
i<j일 때까지
l[i]+l[j]<x이면 i++
l[i]+l[j]>x이면 j--
l[i]==l[j]이면 답을 출력한다.
l[i]==l[j]인 경우가 없다면 danger을 출력한다.
#include<cstdio> #include<algorithm> using namespace std; int x, n, l[1000000]; int main() { while (~scanf("%d", &x)) { scanf("%d", &n); for (int i = 0; i < n; i++) scanf("%d", l + i); sort(l, l + n); int i = 0, j = n - 1; x *= 1e7; while (i < j) { if (l[i] + l[j] < x) i++; else if (l[i] + l[j] > x) j--; else { printf("yes %d %d\n", l[i], l[j]); break; } } if (i >= j) puts("danger"); } return 0; }
댓글 없음 :
댓글 쓰기