http://qiita.com/Nabetani/items/936e7885f4c607472060
http://nabetani.sakura.ne.jp/hena/ord13blocktup/
積み木の水槽に、水をどれだけ貯められるかを計算します。
かかった時間は30分くらい。
考え方は単純です。
「83141310145169154671122」を例に挙げてみると、まず0で分けて「8314131」「145169154671122」にします。
「8314131」を2文字目の「3」で見ると、左側にある壁の最大値は8、右側にある壁の最大値は4、よって左右両方の最大値は4です。
自分の高さは3なので、1升ぶんだけ水が貯まります。
4文字目の「4」で見ると、左の最大値は8、右の最大値は3、自分は4なので貯まりません。
というのを列ごとにくるくるしていくだけです。
「オフラインリアルタイムどう書く」の一覧
http://nabetani.sakura.ne.jp/hena/ord13blocktup/
積み木の水槽に、水をどれだけ貯められるかを計算します。
<?php class BLOCKTUP{ /** * 貯められる水容量を返す * @param String 「83141310145169154671122」みたいな文字列 * @return int 「24」みたいな数値 */ public function get($input){ $count = 0; // 0で分割 $input = explode('0', $input); // くるくる foreach($input as $key=>$block){ // 幅が2以下であれば0 if(strlen($block) < 3){continue;} // 2文字目から最後-1文字目までをくるくる $arr = str_split($block); for($i=1; $i<count($arr)-1; $i++){ // ( 左MAXと右MAXの低い方 - 自分 ) > 0であればそのぶん足す $bucket = min(max(array_slice($arr, 0, $i, true)), max(array_slice($arr, $i+1, NULL, true))) - $arr[$i]; if($bucket > 0){ $count += $bucket; } } } return $count; } } // テスト $test = [ ['83141310145169154671122', '24'], ['923111128', '45'], ['923101128', '1'], ['903111128', '9'], ['3', '0'], ['31', '0'], ['412', '1'], ['3124', '3'], ['11111', '0'], ['222111', '0'], ['335544', '0'], ['1223455321', '0'], ['000', '0'], ['000100020003121', '1'], ['1213141516171819181716151413121', '56'], ['712131415161718191817161514131216', '117'], ['712131405161718191817161514031216', '64'], ['03205301204342100', '1'], ['0912830485711120342', '18'], ['1113241120998943327631001', '20'], ['7688167781598943035023813337019904732', '41'], ['2032075902729233234129146823006063388', '79'], ['8323636570846582397534533', '44'], ['2142555257761672319599209190604843', '41'], ['06424633785085474133925235', '51'], ['503144400846933212134', '21'], ['1204706243676306476295999864', '21'], ['050527640248767717738306306596466224', '29'], ['5926294098216193922825', '65'], ['655589141599534035', '29'], ['7411279689677738', '34'], ['268131111165754619136819109839402', '102'], ]; $blocktup = new BLOCKTUP(); foreach($test as $key=>$data){ $answer = $blocktup->get($data[0]); if($answer !== (int)$data[1]){ print('えらー'); } }なんか見た感じ難しそうだなあと思ってたのですが、実際に作ってみたら予想外に一瞬で終わった。
かかった時間は30分くらい。
考え方は単純です。
「83141310145169154671122」を例に挙げてみると、まず0で分けて「8314131」「145169154671122」にします。
「8314131」を2文字目の「3」で見ると、左側にある壁の最大値は8、右側にある壁の最大値は4、よって左右両方の最大値は4です。
自分の高さは3なので、1升ぶんだけ水が貯まります。
4文字目の「4」で見ると、左の最大値は8、右の最大値は3、自分は4なので貯まりません。
というのを列ごとにくるくるしていくだけです。
「オフラインリアルタイムどう書く」の一覧
PR