カメヲラボ

主にプログラミングとお勉強全般について書いてます

CodeIQ過去問集48:ハリセンボンアタック

本稿はCodeIQで出題された 第2回プロコン:ハリセンボンアタック という問題を再編集したものです。 ※出題時と記述が一部異なる場合がありますがご了承ください。

第4問:ハリセンボンアタック

【ストーリー】

「乙姫様…なんでこんなことを…。」カメがつぶやきました。
「浦島さん、竜宮城へ戻りましょう!!」

浦島太郎はカメと共に、再び竜宮城へ向かいました。

「お前たちが戻ってくるとは…。奴らめしくじりおったな!」
乙姫様に変装していた怪物が正体を現し、今にも襲い掛からんと浦島たちを睨み付けています。

浦島はカメに言いました。
「今度はどんな武器あるの?」

カメ「え?もうありませんよ…。」

絶望的な状況の中、周囲に転がっているハリセンボンに目が留まりました。

「これだ!!」

f:id:Ozy:20180501102805j:plain

【問題】

カメと協力して怪物と戦います。 攻撃手段はハリセンボンを捕まえて怪物に投げつけます。ただし、ハリセンボンを捕まえるときに浦島・カメ共にいくらかのダメージを受けます。自分たちが生き残る最低限の体力は残しつつ、怪物にできるだけ大きなダメージを与えてください。

【問題詳細】

浦島太郎・カメの体力をそれぞれ100と数値化します。 ハリセンボンは何匹かいますが、怪物に与えるダメージ・浦島太郎が受けるダメージ・カメが受けるダメージは異なっており、それらはハリセンボン1匹ごとに数値化されたデータセットとして与えられます。

【入力】

標準入力の1行目に、ハリセンボンの数を表す整数値N(10≦N≦50)が与えられます。 2行目以降のN行に、怪物に与えるダメージ・浦島太郎が受けるダメージ・カメが受けるダメージを表す3つの整数値が半角スペース区切りで与えられます。

【出力】

浦島太郎・カメが共に生き残っている(それぞれ体力値が1以上残っている)状態で、怪物に与えうる最大ダメージを出力してください。

テストデータはこちらからどうぞ

CodeIQ過去問集47:復讐

本稿はCodeIQで出題された 第2回プロコン:復讐 という問題を再編集したものです。 ※出題時と記述が一部異なる場合がありますがご了承ください。

第3問:復讐

【ストーリー】

竜宮城から戻った浦島太郎は、乙姫様から賜った玉手箱を開けました。
漁師でありながらも勉強熱心であった浦島太郎は、「絶対開けないで」という言葉は「開けなさい」と同義であることをよくわかっていたからです。

玉手箱を開けると、中から仕留めたはずのいじめっ子たちが武器を構えて現れました。
「…やられる!!」
そう思った瞬間、カメは言いました。
「このサブマシンガンを使うんだ!」

浦島太郎は狙いを定めました。

f:id:Ozy:20180501102810j:plain

【問題】

いくつかの狙撃目標地点について、各地点間の移動コストが与えられます。 たとえば次のような4地点について、1→3→2→4または4→2→3→1と移動すると移動コストは7となり、他のどの移動方法よりも低コストになります。

【入力】

標準入力から、1行目に整数値N(4≦N≦9)が与えられます。 2行目以降に、N個の整数値が半角スペースによって区切られたN行のデータ、つまりN×N個の整数値が与えられます。 これはNつの点同士の、移動にかかる時間を行列の形式で表したものです。問題文の例にある4点であれば、

4
0 3 8 2
3 0 4 1
8 4 0 5
2 1 5 0

のようなデータが与えられます。 A→BとB→Aは同じ移動コストですので、左上から右下への対角線(0の部分)に対して必ず対称になっています。

【出力】

標準出力に、最小の移動コスト(整数値のみ)を出力してください。

テストデータはこちらからどうぞ

CodeIQ過去問集46:彼魚らの衣装の値段は?

本稿はCodeIQで出題された 第2回プロコン:彼魚らの衣装の値段は? という問題を再編集したものです。 ※出題時と記述が一部異なる場合がありますがご了承ください。

第2問:彼魚らの衣装の値段は?

【ストーリー】

助けた(助けられた?)カメに連れられて、浦島太郎は竜宮城へ行きました。
竜宮城では色々な意味で大変な歓迎を受けることになりました。

浦島太郎はタイやヒラメのような人たちの踊りを見ながら、彼魚らの衣装代が気になりました。個々の衣装には、立派な真珠で固有の番号が刺繍されていたからです。

f:id:Ozy:20180501102814j:plain

【問題】

タイやヒラメのような人たちの人数Nが与えられます。彼魚らの衣装には、固有の番号1~Nが刺繍されています。

衣装のベースは1着あたり10,000円で、真珠の刺繍に金額は番号によってことなります。

0 … 真珠24個
1 … 真珠9個
2 … 真珠21個
3 … 真珠21個
4 … 真珠17個
5 … 真珠21個
6 … 真珠24個
7 … 真珠13個
8 … 真珠27個
9 … 真珠24個

f:id:Ozy:20180501114501p:plain

真珠1個につき1,000円かかるものとします。

たとえば、「10」の番号がついている衣装なら、

ベース…10,000円 「1」…1,000円×9個=9,000円 「0」…1,000円×24個=24,000円

で、合計43,000円になります。

【入力】

標準入力から、整数値N(1≦N≦30000)が与えられます。

【出力】

標準出力に、衣装代の合計金額を出力してください。単位等数値以外は出力しないでください。

テストデータはこちらからどうぞ

CodeIQ過去問集45:ロックオン!

本稿はCodeIQで出題された 第2回プロコン:ロックオン! という問題を再編集したものです。 ※出題時と記述が一部異なる場合がありますがご了承ください。

第1問:ロックオン!

【背景】

本問はCodeIQ第2回プログラミングコンテストで出題された問題の1つです。第1回が講評だったようで、第2回も昔話風でということになりました。

【ストーリー】

砂浜を歩いていた浦島太郎は、カメをいじめようとしている人たちを目撃してしまいました。
逃げようと思いましたが、足がすくんで動くことができません。

浦島太郎の存在に気付いたカメは言いました。
「これで奴らの急所を打ち抜くんだ」
浦島太郎はカメから受け取ったハンドガンを手に、戦う決意をしました。

f:id:Ozy:20180501102818j:plain

【問題】

矩形の文字列データが与えられます。 その中に、急所を表す文字「*」の場所を見つけ、その座標を答えてください。 幅W、高さHの矩形について、左上を(1, 1)、右下を(W, H)とします。

【入力】

標準入力から、1行目に矩形文字列データの幅Wと高さHが、半角スペースで区切られた状態で与えられます。 2行目以降のH行には、幅Wの文字列が与えられます。文字列データの文字には「#」または「*」のみです。

【出力】

標準出力に、急所を表す「*」の座標を出力してください。 座標は横方向・縦方向の順に、半角スペースで区切り1行で出力してください。 ※1オリジンであることにご注意ください。

【入出力例】

5 4
#####
#####
###*#
#####

のような入力に対しては、

4 3

と出力してください。

テストデータはこちらからどうぞ

CodeIQ過去問集44:最大の攻撃を繰り出せ!

本稿はCodeIQで出題された 第1回プロコン:【鬼】最大値をたたき出す攻撃を繰り出して鬼を倒そう という問題を再編集したものです。 ※出題時と記述が一部異なる場合がありますがご了承ください。

第1問がまだの方はこちら

第2問がまだの方はこちら

第3問がまだの方はこちら

第4問:最大の攻撃を繰り出せ!

【ストーリー】

熱々のラーメンからメンマを取り出す作業で軽く手に火傷を負ったあなたですが無事偏食の猿も仲間にすることができました。
犬、雉、猿を仲間にしたあなたは、ついに姫を救い出すために鬼が島に乗り込みます!!!

f:id:Ozy:20150605125910j:plain

鬼  「私をここまで追い込んだやつは今までいなかったぞ。やるな犬、雉、猿よ」
元々運動が得意でないあなたは前線で戦う犬、雉、猿を見ながら本当に3匹を仲間にしてよかったと思っています。
鬼  「だが、ここまでだ。私を倒すには力足らずだったな。」
先ほどまで鬼を押し込んでいた犬、雉、猿でしたが、鬼に攻撃が通らず、徐々に押し返されてきています。
犬  「桃太郎さん。ボク達がバラバラに攻撃していてもあの鬼には通じないみたいだ」
雉  「桃太郎さんも加わって、いちかばちか総攻撃を仕掛けよう」
猿  「桃太郎さんなら、私たちができる攻撃の中から最大値をたたき出す攻撃を考えられますよね?」
今まで岩の影に隠れていたあなたですが、ついに戦いの場に引きずりだされます。
お供の言うとおり、最大値をたたきださなければ全滅です。
でも、きっとここまできたあなたなら大丈夫ですよね。
鬼を倒して、あなただけの桃太郎を完結させてください。

※今さら補足

桃太郎+お供3匹が2×2の二手に分かれて、鬼の左右から大きな岩を同時にぶつけよう!というシチュエーションを想定して作った問題でした。

【問題】

4つのブロックを立方体と考えます。 一辺の長さをそれぞれa, b, c, dとして、

X = a3 + b3 Y = c3 + d3

とすると、X = Yを満たすX(=Y)の最大値を求めてください。

たとえば、1辺の長さが1~20までのとき、

(1) 13 + 123 = 93 + 103

(2) 23 + 163 = 93 + 153

のような場合が考えられますが、(1)を計算すると1729、(2)を計算すると4104となりますので、4104が条件を満たす最大値となります。

【入力】

標準入力から、整数値(20~1000)が与えられます。

【出力】

標準出力に、解となる整数値のみ出力してください。出力後の改行の有無は問いません。

【入出力例】

Case 1: Input

20

Case 1: Output

4104

Case 2: Input

50

Case 2: Output

110808

【解答例】

CodeIQ過去問集43:「MENMA」を探そう

本稿はCodeIQで出題された 第1回プロコン第3問:【猿】偏食の猿の好き嫌いを見極めよう という問題を再編集したものです。 ※出題時と記述が一部異なる場合がありますがご了承ください。

第1問がまだの方はこちら 第2問がまだの方はこちら

第3問:「MENMA」を探そう

【ストーリー】

くそ生意気な雉に頭の良さをみせつけたあなた。
今やウザいくらいあなたにべったりの雉を無事に仲間にできました。
そして、ついに最後の仲間、猿に出会います。

物語のように猿にキビ団子を渡すあなた。
猿  「おいら団子なんて食わねえよ」
あなた「…(てか、この世界でキビ団子全然役に立たねえな。)」
猿  「あ、そうだ。おいらラーメンっていう食い物を一度でいいから食ってみてえんだ」
あなた「まあ、インスタントでいいなら作ってやるぞ」
猿  「ほんとかい?ラーメンくれたら鬼でもなんでも倒してやる」

f:id:Ozy:20150605125848j:plain

ラーメンを作って、猿に出そうとしたその瞬間でした。
猿  「あ、まさかとは思うがメンマは入れてないよな。入ってたら鬼の味方するからな」
メンマ入りのラーメンを作ってしまったあなたは、大慌てでメンマをラーメンから取り除くのでした。

※この画像は私が用意したものではないので、問題が発生した場合はすぐに差し替えるか消します

【問題】

n×n(5≦n≦100)の文字列の中から、「MENMA」と連続する部分があるかどうかを判定してください。

f:id:Ozy:20180430171438j:plain

のように一直線に並んでいる場合だけでなく、

f:id:Ozy:20180430171435j:plain

f:id:Ozy:20180430171433j:plain

のように途中で折れ曲がっていても構いません。

【入力】

標準入力から、n×n(5≦n≦100)の文字列が与えられます。 文字列に含まれる文字は「A, E, M, N」のいずれかで、改行コードはLFです。

【出力】

標準出力に、文字列に連続する「MENMA」が含まれる場合は「yes」、含まれない場合は「no」と出力してください。出力にはyes/no以外の文字は出力しないでください。行末の改行については有無を問いません。

【入出力例】

Case 1: Input

MENME
NMENM
ENMEN
MENMA
NMENM

Case 1: Output

yes

Case 2: Input

EMNME
MNANE
EAENN
MEEEE
EMNEM

Case 2: Output

no

【解答例】

CodeIQ過去問集42:少ない重りで重さを量ろう

本稿はCodeIQで出題された 第1回プロコン:【雉】くそ生意気な雉を黙らせよう という問題を再編集したものです。 ※出題時と記述が一部異なる場合がありますがご了承ください。

第1問がまだの方はこちら

第2問:少ない重りで重さを量ろう

【ストーリー】

じゃんけんにわざと負けてあげることで自信を取り戻した犬を仲間にしたあなた。
鬼が島にむかって旅路を急いでいると、後ろから声が。

雉  「桃太郎さん桃太郎さん、お腰につけたキビ団子ひとつ私にくださいな」
あなた「(お、これは確か仲間になるフラグのあの有名なセリフだな)
    では、これをやるから私と一緒に鬼退治に行こうではないか」

f:id:Ozy:20150605125833j:plain

雉  「…。このキビ団子って何グラムですかね?
    重さによっては鬼退治に同行するより、自分で働いて買った方が早いんで」
あなた「…(雉以外の鳥じゃだめかな)」
とはいえ、犬、雉、猿をそろえなければ鬼には勝てません(と、童話に書いてあった)。
雉の前でキビ団子の重さを計って、大きな団子であることを証明しましょう。
雉  「あ、あと自分頭悪いやつにはついていきたくないんで、最少のおもりの数で計ってくださいね。」
あなた「…(そこにいる雀でなんとか鬼退治できねえかな)」

※この画像は私が用意したものではないので、問題が発生した場合はすぐに差し替えるか消します

【問題】

てんびんが1つあります。これを1回だけ使い、1グラムからnグラムまで、1グラム刻みの重さn通りをすべて量ることができるようにします。使用するおもりの個数をできるだけ少なくなるようにすると、おもりは最低いくつ必要になるかを計算してください。

例えば4グラムまですべて量るには、1グラムのおもり(A)と3グラムのおもり(B)を用意すると、次のように1~4グラムすべて量ることができます。

  • 1グラム…(A)をてんびんの片側に置く

  • 2グラム…(A)をてんびんの片側に、(B)をその反対側に置く(3-1=2グラムを量ることができる)

  • 3グラム…(B)をてんびんの片側に置く

  • 4グラム…(A)と(B)の両方をてんびんの片側に置く(3+1=4グラムを量ることができる)

【入力】

標準入力から、整数n(1≦n≦300)が与えられます。

【出力】

標準出力に、入力nに対するおもりの個数の最小値のみを出力してください。行末の改行コードは有無を問いません。

【入出力例】

Case 1: Input

4

Case 1: Output

2

Case 2: Input

10

Case 2: Output

3

【解答例】