結果
問題 |
No.3060 Erase Binary Matrix
|
ユーザー |
![]() |
提出日時 | 2025-01-26 01:35:41 |
言語 | PyPy3 (7.3.15) |
結果 |
WA
|
実行時間 | - |
コード長 | 2,955 bytes |
コンパイル時間 | 344 ms |
コンパイル使用メモリ | 82,332 KB |
実行使用メモリ | 86,744 KB |
最終ジャッジ日時 | 2025-03-12 00:39:06 |
合計ジャッジ時間 | 7,812 ms |
ジャッジサーバーID (参考情報) |
judge4 / judge1 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 2 |
other | AC * 8 WA * 5 TLE * 1 -- * 35 |
ソースコード
def solve(): import sys input_data = sys.stdin.read().strip().split() if not input_data: return H = int(input_data[0]) W = int(input_data[1]) matrix = [] idx = 2 for _ in range(H): s = input_data[idx] idx += 1 # 各行は01文字列なので、各文字をintに変換してリストにする row = list(map(int, s)) matrix.append(row) # 操作1・2による「自由削除」を行う関数 def free_deletion(mat): changed = True while changed: changed = False # 操作1: 各行が定数ならその行を削除 new_mat = [] for row in mat: if row and all(x == row[0] for x in row): changed = True continue # この行は削除 new_mat.append(row) mat = new_mat if not mat: # 行がなくなった場合終了 break # 操作2: 各列が定数ならその列を削除 if mat and (len(mat[0]) > 0): ncols = len(mat[0]) cols_to_del = [] for j in range(ncols): col = [row[j] for row in mat] if len(set(col)) == 1: # j列が定数なら cols_to_del.append(j) if cols_to_del: new_mat = [] for row in mat: new_row = [val for j, val in enumerate(row) if j not in cols_to_del] new_mat.append(new_row) mat = new_mat changed = True return mat # 初めに自由削除を実施 matrix = free_deletion(matrix) op3_count = 0 # 操作3(任意削除)の回数 # 行列が空(または列がなくなる)まで処理を続ける while matrix and matrix[0]: num_rows = len(matrix) num_cols = len(matrix[0]) best_row = 0 best_score = -1 # 各行を削除候補として評価 for r in range(num_rows): new_mat = matrix[:r] + matrix[r+1:] score = 0 # new_matが空ならすべて削除につながるとみなす if not new_mat: score = num_cols else: for j in range(num_cols): col = [row[j] for row in new_mat] if len(set(col)) == 1: score += 1 if score > best_score: best_score = score best_row = r # 貪欲に選んだ行を操作3で削除 matrix.pop(best_row) op3_count += 1 # 再度自由削除フェーズを適用 matrix = free_deletion(matrix) sys.stdout.write(str(op3_count) + "\n") if __name__ == '__main__': solve()