Problem:
最高のピザ (Best Pizza)

問題

K 理事長は，JOI 市の中心部にある JOI ピザ店の常連客である．彼はある事情により，今月から節約生活を始めることにした．そこで彼は，JOI ピザ店で注文できるピザのうち，1 ドルあたりのカロリーが最大となるようなピザを注文したいと思った．このようなピザを「最高のピザ」と呼ぶことにしよう．「最高のピザ」は 1 種類とは限らない．

JOI ピザでは N 種類のトッピングから何種類かを自由に選び，基本の生地の上に載せたものを注文することができる．同種のトッピングを 2 つ以上載せることはできない．生地にトッピングを 1 種類も載せないピザも注文できる．生地の値段は A ドルであり，トッピングの値段はいずれも B ドルである．ピザの値段は，生地の値段と載せたトッピングの値段の合計である．すなわち，トッピングを k 種類 (0 ≦ k ≦ N) 載せたピザの値段は A + k × B ドルである．ピザ全体のカロリーは，生地のカロリーと載せたトッピングのカロリーの合計である．

生地の値段とトッピングの値段，および，生地と各トッピングのカロリーの値が与えられたとき，「最高のピザ」の 1 ドルあたりのカロリー数を求めるプログラムを作成せよ．

入力

入力は N + 3 行からなる．

1 行目にはトッピングの種類数を表す 1 つの整数 N (1 ≦ N ≦ 100) が書かれている．2 行目には 2 つの整数 A, B (1 ≦ A ≦ 1000，1 ≦ B ≦ 1000) が空白を区切りとして書かれている．A は生地の値段，B はトッピングの値段を表す．3 行目には，生地のカロリー数を表す 1 つの整数 C (1 ≦ C ≦ 10000) が書かれている．

3 + i 行目 (1 ≦ i ≦ N) には，i 番目のトッピングのカロリー数を表す 1 つの整数 Di (1 ≦ Di ≦ 10000) が書かれている．

出力

「最高のピザ」の 1 ドルあたりのカロリー数を 1 行で出力せよ．ただし，小数点以下は切り捨てて整数値で出力せよ．

入出力例

入力例 1

3
12 2
200
50
300
100

出力例 1

37

入出力例 1 では，2 番目と 3 番目のトッピングを載せると，200 + 300 + 100 = 600 カロリーで 12 + 2 × 2 = 16 ドルのピザになる．

このピザは 1 ドルあたり 600 / 16 = 37.5 カロリーになる．これが「最高のピザ」となるので，37.5 の小数点以下を切り捨てた 37 を出力する．

入力例 2

4
20 3
900
300
100
400
1300

出力例 2

100

問題文と自動審判に使われるデータは、情報オリンピック日本委員会が作成し公開している問題文と採点用テストデータです。

Solution in Ruby (judge verdict: Accepted)

def get_i() #空白区切の入力を数値(整数)の配列で返す
  return gets.chomp.split(" ").map(&:to_i)
end
def get_f() #空白区切の入力を数値(実数)の配列で返す
  return gets.chomp.split(" ").map(&:to_f)
end
def get() #空白区切の入力を文字列の配列で返す
  return gets.chomp.split(" ")
end
def get_nsp() #入力されたものを一文字ずつに区切った文字列の配列で返す
  return gets.chomp.split("")
end
def yn_judge(bool,y="Yes",n="No") #boolに真偽を投げることで、trueならy、falseならnの値を出力する
  return bool ? y : n 
end
def array(size1,init=nil,size2=1) #size2に二次元配列時の最初の要素数、size1に次の配列の大きさ、initに初期値を投げることでその配列を返す
  if size2==1
    return Array.new(size1){init}
  else
    return Array.new(size2){Array.new(size1){init}}
  end
end

def max(a,b)
    return a>b ? a : b
end
N=gets.to_i
A,B=get_i
topping=array(N)
col=gets.to_i
N.times do|i|
    topping[i]=gets.to_i
end
topping.sort!{|x,y| x<=>y}
dp=array((N+1)*1000+1,0)

dp[A]=col
N.times do|i|
    ((N+1)*1000).downto(A+B) do|j|
        dp[j]=max(dp[j],dp[j-B]+topping[i])
    end
end
ans=0
1.upto((N+1)*1000) do|i|
  ans=dp[i]/i if ans<dp[i]/i
end
puts ans