【配列活用メニュー】> 【配列に対しての複雑な処理】STEP: 4 二人三脚 (paizaランク C 相当) [難易度: 1549 ±17]
※リンク先へ移動するためには[paiza]へのログインが必要です。
生徒の身長が A_1, ...., A_N であるような N 人のクラスで二人三脚の代表を決めることにしました。代表には、身長の差が最も小さいような 2 人を選出することにしました。選ばれた 2 人の身長を昇順に出力してください。
入力値(例)
5
119
102
187
191
132
出力値(例)
187
191
解答例
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 |
<?php $n = trim(fgets(STDIN)); $a = []; $ans = []; $diff = 0; for($i = 0; $i < $n; $i++) { $a[$i] = trim(fgets(STDIN)); } $diff = abs($a[0] - $a[1]); $ans[0] = $a[0]; $ans[1] = $a[1]; for($i = 0; $i < $n; $i++) { for($j = ($i + 1); $j < $n; $j++) { if(abs($a[$i] - $a[$j]) < $diff) { $diff = abs($a[$i] - $a[$j]); $ans[0] = $a[$i]; $ans[1] = $a[$j]; } } } sort($ans); foreach($ans as $value) { echo $value. "\n"; } ?> |
解説
1)1行目の$nを取得します。
2)空の配列$aと$ansを用意します。$diffには0($diff = 0;)を設定します。
3)2行目以降をfor()で$n回分、$a[$i]に取得していきます。
4)$diffに($a[0] - $a[1])を絶対値(abs)で入れておきます。
入力値1の場合は、119($a[0])と102($a[1])なので差分17が入ります。
5)$iループの中に$jループを作り、if()で($a[$i] - $a[$j])の差分が$diffより小さければ、$diffを書き換えます。そのときに、配列$ansに$a[$i]と$a[$j]を入れます。
6)$ansをsort()で小さい順に並べます。foreach()で取り出して出力します。