競技プログラミングを解こう part3
今回はAtcoderのB問題をやってみました〜
B問題はA問題より難易度が高いです。
下記が問題内容です。
問題文
ABC 洋菓子店では, 個 ドルのケーキと 個 ドルのドーナツが売られている.
このとき, 合計金額が ドルとなる買い方はあるか, 判定せよ. ただし, 同じ商品を二個以上買っても良く, 買わない商品があっても良いものとする.
制約
- は 以上 以下の整数
入力
入力は以下の形式で標準入力から与えられる.
出力
合計が ドルとなる買い方がある場合 Yes
, そうでない場合 No
と出力せよ.
入力例 1 Copy
11
出力例 1 Copy
Yes
ケーキを 個, ドーナツを 個買えば合計 ドルとなる.
入力例 2 Copy
40
出力例 2 Copy
Yes
ケーキを 個買えば ドルとなる.
入力例 3 Copy
3
出力例 3 Copy
No
ケーキの値段は ドル, ドーナツの値段は ドルと, どちらも ドルより高いためそのような買い方は存在しない.
Aに比べると難しい!!
自分はわからなかったので答えを見ました泣
せっかくなので解説していきます!!
入力
入力は以下の形式で標準入力から与えられる.
出力が難しいですね、、
制約を確認してみましょう。
制約
- は 以上 以下の整数
上記の制約なので、ケーキは一個4$なので
4$*25個=100$
最大25個買えますね。
次はドーナツです。
同じように考えると、ドーナツは一個7$なので
7$*14個=98$
最大14個買えます。
問題文に下記の記述があります。
同じ商品を二個以上買っても良く, 買わない商品があっても良いものとする.
なので
ケーキを0〜25個買ったケース+ドーナツを0~14個買ったケースが、入力したNと等しければ'YES'となります。
全部のパターンを考えれば良いのでeachを使います。
(0..14).each do |d|
(0..25).each do |c|
end
end
dはドーナツ、cはケーキです。
これで全部のパターンを考えられます。
あとは入力したNと等しければ'YES'、等しくなければ'No'となるようにします。
(0..14).each do |d|
(0..25).each do |c|
if c*4 + d*7 == N
puts 'Yes'
exit
end
end
end
puts 'No'
ケーキ + ドーナツがN$であればYESと出力します。
exitを入れるのはif文が成立したら、そこでプログラムを終了させるためです。
exitがないとプログラムが続いてしまい、Noも出力されてしまいます。
初めは
if c*4 + d*7 == N
puts 'Yes'
exit
else
puts 'No'
exit
end
でもよくない?と思ったのですが、この場合はNに4が入力されてもeachなので0から順番にd・cに値が入っていきます。
つまり、 if c*4 + d*7 == N が成立しなかった時点でelseにはいってしまいます。
だから下記の記述でなくてはいけません。
(0..14).each do |d|
(0..25).each do |c|
if c*4 + d*7 == N
puts 'Yes'
exit
end
end
end
puts 'No'
なんとなくわかったでしょうか?
B問題もスラスラ解けていけるようになりたいですね〜
最後まで読んでいただき、ありがとうございます。