SRM 517 Div2 250pt: MonochromaticBoard
問題概要
W*H(W,H<50)のボードがあり、最初は真っ白に塗られている。ボードの列か行を選んで全部黒くする、という作業を繰り替えしてボードをある色に塗り替えたい。作業の必要回数を最小化する問題。
考えたこと
- うん?これ最小点被覆(Asteroids POJ 3041, 蟻本205p)?(与えられた盤面を真っ黒にする問題かと思ってた)
- でもDiv2 250でそんなの出る訳無いよね。
- 問題文を読み返してやっと正しく理解した。
- 真っ黒な列、行の数を数えるだけに見える。
- ただし全部黒のときは例外か。
- 書く。無事通った。
practiceで通ったコード
計算量O(W*H)。
#include <vector> #include <string> #include <algorithm> using namespace std; struct MonochromaticBoard { int theMin(vector <string> board) { const int H = board.size(), W = board[0].length(); //全部黒 bool is_white = false; for(int i=0; i<H; i++){ for(int j=0; j<W; j++){ is_white |= board[i][j] == 'W'; } } if(!is_white){ return min(H, W); } int ret = 0; //横に塗る for(int i=0; i<H; i++){ bool is_white = false; for(int j=0; j<W; j++){ is_white |= board[i][j] == 'W'; } if(!is_white){ ret++; } } //縦に塗る for(int j=0; j<W; j++){ bool is_white = false; for(int i=0; i<H; i++){ is_white |= board[i][j] == 'W'; } if(!is_white){ ret++; } } return ret; } };