문제: icpc.me/2230
N개의 원소로 이루어진 수열에서 두 수를 뽑았을 때 그 수의 차이가 M보다 크면서 가장 작은 두 수의 차이를 구하는 문제이다.
우리는 정렬을 해준 뒤 투 포인터 i , j 를 설정하여 문제를 해결할 수 있다.
a[i]-a[j]가 m보다 작다면 두 수의 차이가 더 커져야 하므로 i를 증가시키고 m보다 크거나 같다면 j를 증가시키는 방법으로 해결해나가면 된다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | #include <cstdio> #include <algorithm> #define INF 1987654321 using namespace std; int n, m, a[100001], r; int main() { scanf("%d%d", &n, &m); for (int i = 0; i < n; i++) scanf("%d", &a[i]); sort(a, a + n); int j = 0; r = INF; for (int i = 0; i < n&&j < n;) { if (a[i] - a[j] >= m) { r = min(r, a[i] - a[j]); j++; } else i++; } printf("%d\n", r); return 0; } | cs |
'알고리즘 관련 > BOJ' 카테고리의 다른 글
BOJ)2618 경찰차 (2) | 2017.04.05 |
---|---|
BOJ)2688 줄어들지 않아 (0) | 2017.04.04 |
BOJ)9463 순열 그래프 (1) | 2017.04.03 |
BOJ)2992 크면서 작은 수 (0) | 2017.04.03 |
BOJ)1058 친구 (0) | 2017.04.03 |