페이지

14658번: 하늘에서 별똥별이 빗발친다

https://www.acmicpc.net/problem/14658

답에 해당하는 점들을 포함하는 정사각형의 위치를 오른쪽 위로 최대한 옮겨보면 왼쪽 변과 아래쪽 변 위에 점이 존재한다.
임의의 두 점에 대해 각각 한쪽 성분을 가져와 새로운 점을 만들고 이 점이 왼쪽 아래 꼭지점이 되는 정사각형을 가정한다.
이러한 정사각형들 안 최대 별똥별 개수를 구한다.

시간복잡도는 $O(k^3)$

#include<cstdio>
int n, m, l, k, r, x[100], y[100];
int main() {
    scanf("%d%d%d%d", &n, &m, &l, &k);
    for (int i = 0; i < k; i++) scanf("%d%d", x + i, y + i);
    for (int i = 0; i < k; i++) {
        for (int j = 0; j < k; j++) {
            int c = 0;
            for (int t = 0; t < k; t++) c += x[i] <= x[t] && x[t] <= x[i] + l&&y[j] <= y[t] && y[t] <= y[j] + l;
            if (r < c) r = c;
        }
    }
    printf("%d", k - r);
    return 0;
}

댓글 4개 :

  1. 안녕하세요
    저는 밑에 코드처럼 제출했는데 틀렸다고 나왔는데요
    for (int n = 0;n < K;n++) {
    for (int m = 0;m < K;m++) {
    if (n == m) continue;
    int cnt = 0;
    int x = min(star[n][0], star[m][0]), y = min(star[n][1], star[m][1]);
    for (int k = 0;k < K;k++) {
    int dx = star[k][0] - x, dy = star[k][1] - y;
    if (0 <= dx && dx <= L && 0 <= dy && dy <= L) cnt++;
    }
    ans = max(ans, cnt);
    }
    }
    다른부분은 저는 두 좌표의 맨왼쪽 위를 정사각형의 왼쪽 위 귀퉁이라고 가정하고 풀었는데
    혹시 어떤 부분이 논리에 어긋난지 알려주실 수 있나요?

    답글삭제
    답글
    1. 으 코드 띄어쓰기가 안먹네요 ㅠㅠ

      삭제
    2. 왼쪽 위 귀퉁이에 점이 있는 경우 문제가 있네요.
      if (n == m) continue;
      를 빼야할 것 같습니다.

      삭제
    3. 크어 감사합니다 ㅠㅠ

      삭제