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; }