【paizaの森練習問題コンテスト3】過去問題3 >ラッキーナンバー (paizaランク B 相当) [難易度: 2046 ±44]
※リンク先へ移動するためには[paiza]へのログインが必要です。
与えられた数字を組み合わせて、ラッキーナンバー777を作ろうと考えました。
n個の自然数が与えられるので、足して777になる数字の組み合わせを見つけて、
それらの数字を小さい順に出力してください。
ただし、そのような組み合わせが複数ある場合には multiple answers
そのような組み合わせがない場合には no answer
を出力してください。
入力値(例)
4
333
222
444
666
出力値(例)
333 444
解答例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 |
<?php $n = trim(fgets(STDIN)); for($i = 0; $i < $n; $i++) { $numbers[] = trim(fgets(STDIN)); } sort($numbers); for($i = 0; $i < 1 << $n; $i++) { $ans =[]; $total = 0; for($j = 0; $j < $n; $j++) { if(($i >> $j) & 1) { $ans[] = $numbers[$j]; $total += $numbers[$j]; } } if($total == 777) { $answers[] = $ans; } } $l = 0; if(!empty($answers)) { $l = count($answers); foreach($answers as $value) { $buf = $value; $result = implode(' ', $buf); } } if($l == 0) { echo "no answer"; } elseif($l == 1) { echo $result; } else { echo "multiple answers"; } ?> |
感想
めちゃめちゃ難しかったです。
ビット演算という手法がよく分からなくてあれやこれやという感じです。
もっと勉強してちゃんと解説できるように頑張ります。(*'ω'*)