AOJ 0567 Best Pizza

ACAC002にでたら結果がひどかった…(2完)途中までしか参加しなかったとはいえひどい…
こどふぉはやっと青に戻しましたがスタートラインに戻ったという感じです…
早くDiv1に行きたい…

解法

途中までトッピングの値段がすべて同じだという事に気づかず、普通に平均最大化しようとしてしまいました。書きなおすのがめんどくさかったのでそのまま二分探索しました。
こんな事しなくてもトッピングのカロリーをソートして大きいものから貪欲にとっていくだけで解けます。

#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <algorithm>
#include <vector>
#include <functional>
#include <iostream>
using namespace std;
#define pb push_back
#define INF 2000000000
int cal[101];
int n,a,b,c;
bool C(double x)
{
	vector<double> vec;
	for(int i=0;i<n;i++)
	{
		double k=cal[i]-x*b;
		vec.pb(k);
	}
	sort(vec.begin(),vec.end(),greater<double>());
	double sum=0.0;
	for(int i=0;i<n;i++)
	{
		sum+=vec[i];
		if(sum>=x*a-c)return true;
	}
	return false;
}
int main()
{
	cin >> n;
	cin >> a >> b;
	cin >> c;
	for(int i=0;i<n;i++)
	{
		cin >> cal[i];
	}
	double lb=0.0,rb=INF;
	for(int i=0;i<100;i++)
	{
		double mid=(lb+rb)/2;
		if(C(mid))lb=mid;
		else rb=mid;
	}
	cout << (int)lb << endl;
	return 0;
}