#if __has_include() #include using namespace atcoder; #else #include #if __has_include() #include using namespace atcoder; #endif #endif using namespace std; #define int long long #define all(x) (x).begin(), (x).end() #define rep(i, n) for (int i = 0; i < (int)(n); i++) #define rrep(i, n) for(int i = (int)((n) - 1); i >= 0; i--) template bool chmax(T &a,const T &b){if(a bool chmin(T &a,const T &b){if(a>b){a=b;return true;}return false;} // using mint = modint; signed main(){ int r, p, q, d; vector abc(3); cin >> r >> p >> q; for(auto&& i : abc) cin >> i; cin >> d; sort(all(abc)); int ans = 0; int nans = min(r / p, abc.front()); r -= p * nans; for(auto&& i : abc) i -= nans; ans += nans; nans = min({abc.at(1) - abc.at(0), r / (q + p), d}); r -= (q + p) * nans; d -= nans; abc.at(1) -= nans; abc.at(2) -= nans; ans += nans; if(d == 0){ nans = min({abc.at(2) - abc.at(1), abc.at(1), r / (q + p)}); r -= (q + p) * nans; abc.at(1) -= nans; abc.at(2) -= 2 * nans; ans += nans; if(abc.at(1) == abc.at(2)){ nans = min(abc.at(1) * 2 / 3, r / (q + p)); r -= (q + p) * nans; abc.at(1) -= (nans + 1) / 2 + nans; abc.at(2) -= nans / 2 + nans; ans += nans; } } nans = min({abc.at(2) - abc.at(1), r / (2 * q + p), d / 2}); r -= (2 * q + p) * nans; d -= nans * 2; abc.at(2) -= nans; ans += nans; if(d == 0){ nans = min(abc.at(2) / 3, r / (2 * q + p)); r -= (2 * q + p) * nans; abc.at(2) -= nans * 3; ans += nans; } nans = min({r / (3 * q + p), d / 3}); r -= (3 * q + p) * nans; d -= nans * 3; ans += nans; println("{}", ans); } /* min(r / p, a, b, c)人はできる 後は少ない順に補充しながら作る感じになる a<=b<=cと仮定すると、 b-a回、1回につきq+pで作れる c-a回、1回につき2q+pで作れる inf回、1回につき3q+pで作れる dが0になっても人数調整をできる場合がある 一旦飛ばす d==0のときの戦術を考える 一番多い色の人を一番少ない色の人にするのは明らか 一番少ない色の人は0人であることを仮定してよさそう 0, b, c人のとき、min(c / 2, b)回cをaにしそう ↑本当か?cがbを下回るようにするのか? 0, 0, c人のとき、c/3回cをa, bにしそう 0, x, y(x < y)のとき、min(y-x, x)回cをaにしそう 0, x, xのとき、合計で2xいるので、2 * x / 3回bやcをaにしそう 0, 0, xのとき、x/3回cをaとbにしそう */