SRM 373 250pt: StringFragmentation
問題概要
H*W(H,W<10000)のサイズのディスプレイがある。単語が複数あるので、単語を行からはみ出さないように配置する。フォントのサイズを最大いくつにできるか求める問題。
考えたこと
- 二分探索っぽいけどこれくらいなら全探索で通る。
- フォントのサイズを固定したときの判定部分を書くだけだし、特に難しい所もなさそう。でも場合分けが出てきてしまう。
- ちょっと考えたけど場合分けが回避できない。
- 書けたけどキレイじゃなくて自信無い。投げたらちゃんと通ってた。
practiceで通ったコード
#include <string> #include <vector> #include <sstream> using namespace std; struct StringFragmentation { int largestFontSize(string text, int width, int height) { //数値に変換 vector<int> nums; stringstream ss(text); string buf; while(ss>>buf){ nums.push_back( (int)buf.size() ); } const int N = nums.size(); for(int sz=10009; sz>7; sz--){ int row_count = 1; bool ok = true; for(int i=0, cur=0; i<N; i++){ int w = (sz + 2)*nums[i]; if(cur==0){ if(w > width){ ok = false; break; } else{ cur += w; } } else{ if(cur + w + sz + 2 > width){ cur = 0; row_count++; i--; } else{ cur += w + sz + 2; } } } if(ok && row_count * 2*sz <= height){ return sz; } } return -1; } };
バグを減らす工夫
- 場合分けが出てきたらとにかくコメント書くようにしよう。意識しないと間違えやすいしデバッグもしにくくなる。