【AtCoder:3回目】AtCoder Beginner Contest 128の振り返り(Ruby)
【目次】
【本題】
振り返り
今回は、5/26(日)に開催されたAtCoder Beginner Contest 128の振り返りを行います。
AtCoder Beginner Contest 128 - AtCoder
結果は、2問目で力尽きて、3問目に到達できず・・・
ratingは微増です
色が付くのは、まだ先ですね・・・
A - Ferris Wheel
問題文 林檎が A 個、林檎の欠片が P 個あります。
林檎 1 個は、砕くことで林檎の欠片 3 個になります。また、林檎の欠片 2 個を鍋で煮込むことで、アップルパイが 1 個作れます。
今ある材料で作れるアップルパイの最大数を求めてください。
りんごは全部欠片にして、欠片を足して、2で割るだけと考えました。
a,piyo=gets.split.map &:to_i p ( ( a * 3 ) + piyo ) / 2
他の回答を見ても、概ね同じ方法でした。
B - Guidebook
問題文 あなたは美味しいレストランを紹介する本を書くことにしました。 あなたは N 個のレストラン、レストラン 1 、レストラン 2 、 … 、レストラン N を紹介しようとしています。レストラン i は S i 市にあり、あなたは 100 点満点中 P i 点と評価しています。 異なる 2 個のレストランに同じ点数がついていることはありません。
この本では、次のような順でレストランを紹介しようとしています。
市名が辞書順で早いものから紹介していく。 同じ市に複数レストランがある場合は、点数が高いものから紹介していく。 この本で紹介される順にレストランの番号を出力してください。
今回は、下記の様な手順で処理する方法を考えました。
1:標準入力を配列に格納 2:1の配列から、Nを抜き出す 3:Nを抜き取った配列の各要素に並び順で連番を割り振る 4:3を市名で昇順にソートする 5:4から市名だけ抜き出し、重複を排除した配列を作成する 6:5をeachで回して、その中で同じ市名のグループを抽出し、点数でソートする 7:6をeachで回して、3で割り振った連番を、配列の並び順に出力する
inputs = [] while input = $stdin.gets do inputs << input.chomp.split(" ") end n = inputs.shift citys = [] inputs.each.with_index(1) do |city, i| city << i citys << city end citys_name_sort = citys.sort super_citys = [] names = [] citys_name_sort.each do |name| names << name[0] end names.uniq.each do |name| check_names = [] citys_name_sort.each do |city_n| if name == city_n[0] check_names << city_n end end super_citys << check_names.sort{ |a, b| b[1].to_i <=> a[1].to_i } end super_citys.each do |a0| a0.each do |a1| p a1[2] end end
4の時点で、点数も含めてソートされると思ったのですが、上手くいかなかったので、5〜6の処理を追加しました。
思いつきの力技なので、かなりグチャグチャです・・・
そして他の人の回答を見ていると、下記でもいける様でした。
N = gets.to_i list = [] N.times do |i| s, p = gets.split(" ") p = p.to_i list << [s, -p, i+1] end list.sort! list.each do |(a, b, i)| puts i end
「なんでソート一回で上手く行ってるの?」
府に落ちなかったので、出力結果を見比べました。
#自身のコード [["khabarovsk", "20", 1], ["moscow", "10", 2], ["kazan", "50", 3], ["kazan", "35", 4], ["moscow", "60", 5], ["khabarovsk", "40", 6]] #模範コード [["khabarovsk", -20, 1], ["moscow", -10, 2], ["kazan", -50, 3], ["kazan", -35, 4], ["moscow", -60, 5], ["khabarovsk", -40, 6]]
「あっ(察し)」
模範はint型にして、かつ負号を付ける事で、昇順でソートさせる事ができる様でした。
めっちゃ簡単な問題だったんですね・・・