| 시간 제한 | 메모리 제한 | 제출 | 정답 | 맞힌 사람 | 정답 비율 |
|---|---|---|---|---|---|
| 3 초 | 1024 MB | 28 | 12 | 12 | 42.857% |
바쿠는 정사각형 모양의 넓은 땅을 균등하게 구획을 나눠 작은 정사각형 밭을 $N \times N$개 만들 었다. 각 밭에 $P$개씩 씨를 뿌린 후 일주일 후에 보니 어떤 씨는 새싹이 났고 어떤 씨는 아직 새싹이 나지 않았다. 예를 들어, 아래 그림은 6ドル \times 6$개의 밭에 3ドル$개씩의 씨를 뿌린 후 새싹이 난 모습을 나타낸다. 가장 왼쪽 위 밭에는 두 개의 새싹이 났고, 가장 오른쪽 아래 밭에는 한 개의 새싹이 났다.
밭을 둘러보던 바쿠는 최근에 배운 중간값(median)이 생각났다. 중간값은 홀수개의 주어진 값들 중 하나로, 주어진 값들을 정렬했을 때 정확히 가운데에 있는 값이다. 예를 들어, 다섯 개의 주어진 값이 0,ドル 1, 2, 2, 3$이라면 중간값은 2ドル$가 된다.
바쿠는 중간값과 평균이 얼마나 다를 수 있는지 궁금하여 각 밭에 난 새싹의 개수의 중간값과 평균을 비교해보려 한다. 다양한 경우를 살펴보기 위해 비교할 중간값과 평균은 정사각형 모양의 인접한 $K \times K$개 밭에 대해 구하도록 한다. 이렇게 하면 주어진 $N \times N$개 밭에서 총 $(N-K+1) \times (N-K+1)$번의 비교가 가능하다.
예를 들어, 위 그림의 밭에 대해 3ドル \times 3$개 단위로 중간값과 평균을 모두 구해보면 아래 표와 같다. 가장 왼쪽 위의 3ドル \times 3$개 밭에 난 새싹의 개수는 2ドル$개, 1ドル$개, 0ドル$개, 0ドル$개, 1ドル$개, 0ドル$개, 2ドル$개, 0ドル$개, 1ドル$개이므로 중간값은 1ドル,ドル 평균은 7ドル/9$이다. 가장 오른쪽 위의 3ドル \times 3$개 밭에 대한 중간값은 0ドル,ドル 평균은 8ドル/9$이다.
바쿠는 중간값과 평균의 차이의 최댓값을 구하려 한다. 위 예에서 최댓값을 갖는 경우는 아래 그림에서 붉은 정사각형으로 표시된 부분으로, 중간값이 0ドル,ドル 평균이 1ドル$로 두 값의 차이는 1ドル$이다.
바쿠는 계산의 편의를 위해 중간값과 평균의 차이를 $K^2$배 한 값의 최댓값을 구하려 한다. 따라서 위 예에서 최댓값은 9ドル$가 된다. 여러분은 바쿠를 위해 다음 함수를 구현해야만 한다.
int diff( int K, int[][] V ) ; 단 한번 호출되는 함수이다. $V$는 크기 $N \times N$인 배열(vector)이다. 각 밭에 난 새싹의 개수 $V[0..N-1][0..N-1]$이 인자로 주어진다. $K \times K$ 크기 단위로 찾은 중간값과 평균의 차이를 $K^2$배 한 값의 최댓값을 구하여 return 한다.여러분은 sprout.cpp라는 이름을 가진 하나의 파일을 제출해야만 한다. 이 파일에는 다음의 함수가 구현되어 있어야 한다.
int diff( int K, int[][] V ) ;이 함수는 위에서 설명한 것과 같이 동작하여야 한다. 물론, 다른 함수들을 만들어서 내부적으로 사용할 수 있다. 제출한 코드는 입출력을 수행하거나 다른 파일에 접근하여서는 안된다.
주어지는 그레이더는 다음과 같은 형식으로 입력을 읽는다.
주어지는 그레이더는 여러분의 코드가 diff() 함수에서 리턴한 값을 출력한다.
| 번호 | 배점 | 제한 |
|---|---|---|
| 1 | 17 | $N \le 100$ |
| 2 | 24 | $N \le 300$ |
| 3 | 42 | $N \le 700$ |
| 4 | 67 | 추가 제한이 없다. |
6 3 2 1 0 1 0 2 0 1 0 3 0 0 2 0 1 0 0 2 1 2 2 2 2 0 1 2 2 0 0 1 0 1 0 0 2 1
9
4 3 10 20 10 20 20 10 20 10 10 20 10 20 20 10 20 10
40
Olympiad > 국제정보올림피아드 대표학생 선발고사 > 2019 > 2차 선발고사 1번
C++17, C++20, C++23, C++26, C++17 (Clang), C++20 (Clang)