Test Data Creation
시간 제한4초메모리 제한512 MB
각 칸을 1로 바꾸는 비용이 주어질 때, 차원을 바꿔 읽는 잘못된 코드와 올바른 코드가 모두 Yes를 출력하도록 격자를 채우는 최소 비용을 구한다.
문제
진우는 함수컵 예비소집에 나온 도시와 비트코인 문제를 보고 아래와 같은 코드로 문제를 풀었다.
#include <stdio.h>
int N, M, arr[301][301];
bool solve() {
... // 중략
}
int main() {
scanf("%d%d", &N, &M);
for(int i=0; i<N; i++) {
for(int j=0; j<M; j++) {
scanf("%d", &arr[i][j]);
}
}
puts(solve() ? "Yes" : "No");
return 0;
}
진우가 코드를 제출한 후 채점 결과를 기다렸다가 틀렸습니다 결과를 보고 충격을 받았다. 진우는 4시간 동안 '맞았는데 왜 틀리지?'를 중얼거리면서 고민하다가, 과 을 반대로 입력했다는 것을 깨달았다. 결국 진우는 과 을 입력하는 부분만 바꿔서 맞았습니다!! 를 받았다.
이러는 진우를 본 명준이는 이 문제를 C모 사이트 대회에 내면 재미있겠다는 생각이 들었다. 명준이는 프리테스트(Pretest, 대회 도중에 제공하는 데이터)에는 약한 데이터만을 넣어두어서 진우가 틀린 코드를 냈을 때 맞았습니다!! 결과를 보고 방심했다가 시스템 테스트(Systest, 대회 이후에 추가로 채점하는 데이터)에서 결과가 바뀌는 것을 기대하고 있다.
명준이는 진우의 코드를 통과시키는 약한 데이터를 제작하려고 한다. 명준이는 우선 개의 격자 값을 모두 0으로 초기화했다. 이제 명준이는 격자의 일부 값을 1로 바꾸려는데 명준이의 컴퓨터는 별로 좋지 않기 때문에 각 격자의 값을 1로 바꾸는 데 좀 시간이 걸린다. 행 열의 값을 1로 바꾸기 위해서는 만큼의 시간이 필요하다.
명준이는 답이 No인 약한 데이터는 금방 만들었으나 답이 Yes인 약한 데이터는 만드는 데 너무 많은 시간이 걸린다. 어쩔 수 없이 명준이는 당신에게 도움을 요청했다! 명준이를 도와 약한 데이터를 최대한 빨리 만드는 프로그램을 작성하여라.
입력
첫 번째 줄에 데이터의 가로 크기 과 세로 크기 이 주어진다. ()
두 번째 줄부터 개의 줄에는 각 격자의 값을 1로 바꾸는 데 걸리는 시간 ()가 주어진다.
출력
첫 번째 줄에는 약한 데이터를 만드는 데 걸리는 시간의 최솟값을 출력한다.
두 번째 줄부터 개의 줄에는 데이터를 나타내는 개의 정수(0 또는 1)를 공백을 사이에 두고 출력한다. 이 데이터는 진우의 잘못된 코드와 정답 코드에서 모두 Yes가 나와야 한다.
만약 만들 수 있는 데이터가 여러 개라면 그중 아무거나 출력한다.