#include #include //cin/cout #include //cout string #include //rambda #include #include //next/prev #include #include //iota #include #include #include #include #include #include #include using namespace atcoder; using namespace std; using llong = long long; const llong INF = 1LL << 60;//INF > 10^18(1e18) const int INF32 = 1LL << 30;//INF32 > 10^9(1e9) template bool chmax(T& max, const T& b) { if (max >= b) return false; max = b; return true; } template bool chmin(T& min, const T& b) { if (min <= b) return false; min = b; return true; } ///////////////////ここまでtoolbox///////////////////////////////////// int main() { llong R, P, Q; cin >> R >> P >> Q; llong A, B, C, D; cin >> A >> B >> C >> D; //にぶたんlib llong l, r, m; //l,rはf(m)の単調増加性が維持されていて、解としてありえる範囲以上であれば問題ない //過去にもあったが、"f(m)の内部でオーバーフローが起きる"ケースに注意 l = 0; //0で良いか注意 r = 2e18;//オーバーフロー注意 解の範囲ちょうどまであればOK llong b_ans; b_ans = l; //L側の最大値を出したい場合、L側の初期値が最悪解 //rambda function auto f = [&](llong t) { //t人のルーマニア人を作れるか if ((A + B + C + D) / 3 < t)return false; llong cost = 0; cost += P * t; cost += Q * (max(t - A, 0LL) + max(t - B, 0LL) + max(t - C, 0LL)); if (cost > R)return false; return true; }; while (l <= r) { m = (l + r) / 2; if (f(m)) {//L側=条件を満たしているので b_ans = m;//更新して l = m + 1;//Lを大きくする } else { r = m - 1;//Rを小さくする } } cout << b_ans << endl; return 0; }