이 문제는 함수형 인터랙티브 문제이다.
격자가 숨겨져 있다. 각 칸에는 블록이 하나 놓여 있거나, 아무것도 놓여 있지 않다. 여러분은 숨겨진 격자를 직접 볼 수 없다.
여러분은 다음 두 종류의 레이저를 사용할 수 있다.
- 각 행에 대해, 왼쪽에서 오른쪽으로 발사되는 레이저
- 각 열에 대해, 위에서 아래로 발사되는 레이저
각 레이저에는 강도 를 설정할 수 있다. 강도가 인 레이저는 진행 방향에서 만나는 블록 중 처음 개를 관통하고, 그 다음 블록에서 멈춘다. 진행 방향에 있는 블록의 수가 개 이하라면, 레이저는 격자 밖으로 빠져나간다.
여러분은 최대 번의 실험을 할 수 있다. 한 번의 실험에서는 모든 행과 모든 열에 대해 원하는 강도를 설정하여 동시에 레이저를 발사한다. 실험이 끝나면 각 레이저가 멈춘 위치, 또는 격자 밖으로 빠져나갔다는 정보가 주어진다.
주어진 실험 결과만을 이용하여 격자 전체에 존재하는 블록의 개수를 구하여라.
구현 방식
여러분은 반드시 다음 헤더 파일을 포함해야 한다.
#include "plast.h"
여러분은 다음 함수를 구현해야 한다.
int count_blocks(int n);
main 함수는 구현하면 안 된다. 채점용 그레이더가 main 함수를 제공한다.
함수 count\_blocks는 격자의 크기 을 인자로 받는다. 이 함수는 experiment 함수를 최대 번 호출할 수 있으며, 마지막에 격자 전체에 존재하는 블록의 개수를 반환해야 한다.
다음 함수는 그레이더가 제공한다.
std::vector<int> experiment(
const std::vector<int>& row_strength,
const std::vector<int>& col_strength
);
row\_strength와 col\_strength는 모두 길이가 이어야 한다.
row\_strength[i]는 번째 행에 왼쪽에서 오른쪽으로 발사되는 레이저의 강도이다.col\_strength[j]는 번째 열에 위에서 아래로 발사되는 레이저의 강도이다.
모든 강도는 이상 이하의 정수여야 한다.
experiment 함수는 길이 의 벡터를 반환한다.
- 반환값의 처음 개 원소는 행 레이저의 결과이다. 번째 행 레이저가 번째 열에서 멈췄다면 를 반환하고, 격자 밖으로 빠져나갔다면 을 반환한다.
- 반환값의 다음 개 원소는 열 레이저의 결과이다. 번째 열 레이저가 번째 행에서 멈췄다면 를 반환하고, 격자 밖으로 빠져나갔다면 을 반환한다.
experiment 함수를 번보다 많이 호출하거나, 잘못된 길이의 벡터를 넘기거나, 범위를 벗어난 강도를 넘기면 오답으로 처리된다.
Input
이 문제는 함수형 인터랙티브 문제이므로, 참가자 프로그램은 표준 입력을 직접 읽지 않는다.
그레이더가 숨겨진 격자의 크기 을 count\_blocks(n)의 인자로 전달한다.
Output
참가자 프로그램은 표준 출력에 답을 직접 출력하지 않는다.
count\_blocks(n) 함수는 격자 전체에 존재하는 블록의 개수를 반환해야 한다.
Constraints
- .
- 각 칸에는 블록이 하나 있거나, 아무것도 없다.
experiment함수는 최대 번 호출할 수 있다.- 각 실험에서 모든 레이저의 강도는 이상 이하의 정수여야 한다.
Subtasks
해설
관리자가 작성한 해설을 별도 페이지에서 볼 수 있어요.