結果

問題 No.9 モンスターのレベル上げ
ユーザー らっしー(raccy)らっしー(raccy)
提出日時 2015-01-26 22:30:38
言語 Ruby
(3.3.0)
結果
TLE  
実行時間 -
コード長 2,216 bytes
コンパイル時間 45 ms
コンパイル使用メモリ 7,552 KB
実行使用メモリ 17,792 KB
最終ジャッジ日時 2024-06-23 03:18:24
合計ジャッジ時間 6,917 ms
ジャッジサーバーID
(参考情報)
judge1 / judge4
このコードへのチャレンジ
(要ログイン)

テストケース

テストケース表示
入力 結果 実行時間
実行使用メモリ
testcase_00 AC 77 ms
12,160 KB
testcase_01 AC 82 ms
12,288 KB
testcase_02 TLE -
testcase_03 WA -
testcase_04 WA -
testcase_05 AC 1,706 ms
12,416 KB
testcase_06 AC 637 ms
12,416 KB
testcase_07 AC 83 ms
12,288 KB
testcase_08 AC 832 ms
12,544 KB
testcase_09 TLE -
testcase_10 -- -
testcase_11 -- -
testcase_12 -- -
testcase_13 -- -
testcase_14 -- -
testcase_15 -- -
testcase_16 -- -
testcase_17 -- -
testcase_18 -- -
testcase_19 -- -
権限があれば一括ダウンロードができます
コンパイルメッセージ
Syntax OK

ソースコード

diff #

class Moster
  attr_reader :level, :count, :point
  attr_accessor :left, :right, :parent

  def initialize(level, count_over)
    @level = level
    @count_over = count_over
    @count = 0
    update_point
    @left = nil
    @right = nil
    @parent = nil
  end

  def get_exp(exp)
    @level += exp
    @count += 1
    update_point
  end

  def update_point
    @point = @level * @count_over - @count
  end

  def add_tree(other)
    if @point > other.point
      if @left
        @left.add_tree(other)
      else
        @left = other
        other.parent = self
      end
    else
      if @right
        @right.add_tree(other)
      else
        @right = other
        other.parent = self
      end
    end
  end

  def min_point
    if @left
      return @left.min_point
    else
      return self
    end
  end
end

class EnemyParty
  def initialize(level_list)
    @exp_list = level_list.map{|i|i / 2}
    @size = level_list.size
  end

  def exp_each_with_start_pos(start_pos)
    @size.times do |i|
      yield @exp_list[(start_pos + i) % @size]
    end
  end
end

class OwnParty
  def initialize(level_list)
    @moster_list = []
    @size = level_list.size
    @count_over = @size + 1
    @tree_root = nil
    level_list.each do |level|
      moster = Moster.new(level, @count_over)
      @moster_list << moster
      if @tree_root
        @tree_root.add_tree(moster)
      else
        @tree_root = moster
      end
    end
  end

  def max_count
    return @moster_list.max_by{|moster|moster.count}.count
  end

  def get_exp(exp)
    moster = @tree_root.min_point

    moster.get_exp(exp)

    if moster.right
      if moster.parent
        moster.parent.left = moster.right
        moster.right.parent = moster.parent
      else
        @tree_root = moster.right
        moster.right.parent = nil
      end
      moster.right = nil
    else
      moster.parent.left = nil
    end
    moster.parent = nil

    @tree_root.add_tree(moster)
  end
end

n = gets.to_i
own_list = gets.split.map(&:to_i)
ene = EnemyParty.new(gets.split.map(&:to_i))
list = (0..n).map do |i|
  own = OwnParty.new(own_list)
  ene.exp_each_with_start_pos(i) do |exp|
    own.get_exp(exp)
  end
  own.max_count
end
puts list.min
0