久々にTopCoderで解答が通ったのでネタもないし、書く。
でもRatingは落ちてとうとう600切った。
周りには800とか1200とかゴロゴロいるというのに・・・
問題文の解釈
黒色、灰色、白色のウサギさんがいて、ある問題をAからZの記号1文字で解答していった。
黒ウサギさんは、絶対間違える。
このとき、全体の点数の和は最大何点となりえるか。
問題文は全部同じで、同じ数の解答をしている。問題1問につき1点。
黒ウサギと同じ解答なら、それは間違い
白ウサギと灰ウサギの解答が同じなら、0点か2点のどちらか。
白ウサギと灰ウサギの解答が異なる、0点か1点のどちらか。
今回は最大となりうる値を返せば良い。
#include <string> using namespace std; class BunnyExamAfter{ public: static int getMaximum(string black, string gray, string white){ int sum = 0; for(int i=0; i<black.length(); ++i){ if(black[i] != gray[i] || black[i] != white[i]){ sum += (gray[i] == white[i] ? 2:1); } } return sum; } };
簡単な問題だったけど、英文を読み解くのに30分かかりました。
ウサギさんの数が増えた時の対応が非常に億劫な実装。
250ぐらいの問題なら、僕でも簡単に解答できていいですねえ。
500はなんとなくわかったけど、実装をどうすればいいか悩んでるうちに時間切れ。
size%(k+1)==0になるなら単純に総和取ればよさそう。余ったらそれだけ使われない値の数になる?
[n]+[n+k]が大きい値をとる組み合わせをとっていけばいいのはわかったんだが・・・
再帰で出来るかな!って思って実装したけど、上手く動かず。
うーん、あとでやってみようかな。