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 JAVA (judge verdict: Wrong Answer)

import java.util.*;

public class Main {
	
	static void print_dollor(int material_value, int topping_value, int num, int ans) {
		System.out.println(ans / (material_value + topping_value * num));
	}
	
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Scanner stdIn = new Scanner(System.in);
		int topping_num = stdIn.nextInt();
		int money = stdIn.nextInt();
		int topping_value = stdIn.nextInt();
		int material_calorie = stdIn.nextInt(); //初期値として生地の値段を与える
		
		int[] data = new int[topping_num];
		int[] sum = new int[topping_num + 1];
		
		for(int r = 0; r < data.length; r++)
			data[r] = stdIn.nextInt();
		Arrays.sort(data); //後で修正
		for(int r = 0; r < data.length; r++) {
			sum[r + 1] = sum[r] + data[r];
		}
		int ans = -1, num = 0;
		for(int r = 1; r < sum.length; r++) {
			int psum = sum[sum.length - 1] - sum[r];
			if(psum > ans) {
				num = sum.length - 1 - r;
				ans = psum;
			}
		}
		ans += material_calorie;
		
		print_dollor(money, topping_value, num, ans);
		
	}

}