結果

問題 No.3681 心の沸騰石
コンテスト
ユーザー でんろく
提出日時 2026-09-07 10:41:16
言語 C++23(gcc16)
(gcc 16.1.0 + boost 1.92.0 + ACL)
コンパイル:
g++-16 -O2 -lm -std=c++23 -Wuninitialized -DONLINE_JUDGE -o a.out _filename_
実行:
./a.out
結果
WA  
実行時間 -
コード長 5,402 bytes
記録
記録タグの例:
初AC ショートコード 純ショートコード 純主流ショートコード 最速実行時間
コンパイル時間 4,943 ms
コンパイル使用メモリ 388,260 KB
実行使用メモリ 9,768 KB
最終ジャッジ日時 2026-09-07 10:41:23
合計ジャッジ時間 6,532 ms
ジャッジサーバーID
(参考情報)
judge1_0 / judge3_0
このコードへのチャレンジ
(要ログイン)
ファイルパターン 結果
sample AC * 1 WA * 3
other AC * 5 WA * 8
権限があれば一括ダウンロードができます

ソースコード

diff #
raw source code

#include <bits/stdc++.h>
#include <atcoder/all>
using namespace std;
#define rep(i, l, r) for (ll i = (l); i < (r); i++)
#define drep(i, l, r) for (long long i = (r) - 1; i >= l; i--)
#define nall(a) a.begin(), a.end()
using ll = long long;
using lll = __int128;
using P = pair<ll, ll>;
template <typename T>
using vc = vector<T>;
template <typename T>
using vvc = vc<vc<T>>;
template <typename T>
using vvvc = vc<vvc<T>>;
template <typename T>
auto find_exactly(vector<T> &a, T x)
{
  auto t = lower_bound(nall(a), x);
  if (t == a.end() || *t != x)
    return a.end();
  return t;
}
// template<typename T >
bool kaibun(string &v)
{
  ll y = v.size();
  rep(i, 0, (y + 1) / 2)
  {
    if (v[i] != v[y - 1 - i])
    {
      return false;
    }
  }
  return true;
}
ll floor(ll x, ll m)
{
  ll r = (x % m + m) % m;
  return (x - r) / m;
  // 負の数の割り算をしたいときに使う
  //-7/2=-4になるこれだったら
}
ll cross(ll ax, ll ay, ll bx, ll by)
{
  // 二つのベクトルの外積を求める
  return ax * by - ay * bx;
  // これが0だったら平行
  // 原点->a->bの順にまわる
}
ll dot(ll ax, ll ay, ll bx, ll by)
{
  // ベクトルの内積を求める
  return ax * bx + ay * by;
  // これが0だったら垂直
}
bool ispoint(ll px, ll py, ll qx, ll qy, ll rx, ll ry, ll sx, ll sy)
{
  ll bigx = px - qx;
  ll bigy = py - qy;
  ll smallx = rx - sx;
  ll smally = ry - sy;
  ll vec = cross(bigx, bigy, smallx, smally);
  if (vec != 0)
    return true;
  else
  {
    ll tx = rx - px;
    ll ty = ry - py;
    if (cross(bigx, bigy, tx, ty) == 0)
      return true;
    return false;
  }
  // 2直線が交点を持つかを判定するヨ
}
bool isout_grid(ll i, ll j, ll h, ll w)
{
  // グリッド内ならfalseグリッド外ならtrue
  return (!(0 <= i && i < h && 0 <= j && j < w));
}
void Yes(bool a)
{
  if (a)
  {
    cout << "Yes" << endl;
    return;
  }
  else
  {
    cout << "No" << endl;
    return;
  }
}
bool compare(P &a, P &b)
{
  return a.first - a.second > b.first - b.second;
  // <で小さい順 >で大きい順
  // pairのsecondでソートする比較関数
  // >で大きい順 <で小さい順
  // sort(配列名.begin(),配列名.end(),compare)で使える
}
ll kyoutuuhanni(P a, P b)
{
  ll q = max(a.first, b.first);
  ll e = min(a.second, b.second);
  if (e - q < 0)
  {
    return 0;
  }
  else
  {
    return e - q + 1;
  }
}
ll binary(ll n)
{ // n以下の数を探すみたいなやつ改造して
  ll l = 0;
  ll r = 1e9;
  ll mid;
  while (r - l > 1)
  {
    mid = (l + r) / 2;
    if (mid <= n)
    {
      l = mid;
    }
    else if (mid > n)
    {
      r = mid;
    }
  }
  return l;
}
ll infinity = 8e18; // long long の上限(約 9.22×10^18)
const int dx[] = {-1, 0, 1, 0, 1, 1, -1, -1};
const int dy[] = {0, 1, 0, -1, 1, -1, 1, -1};
// mapは必ずfirstとsecond
long double kyori(ll x1, ll y1, ll x2, ll y2)
{
  ll t = (x1 - x2) * (x1 - x2) + (y1 - y2) * (y1 - y2);
  long double a = sqrt(t);
  return a;
}
bool isprime(ll n)
{ // 高速な素数判定
  for (ll i = 2; i * i <= n; i++)
  {
    if (n % i == 0)
    {
      return false;
    }
  }
  return true;
}
long long modpow(long long a, long long n, long long mod)
{ // 高速な累乗の余り
  long long res = 1;
  while (n > 0)
  {
    if (n & 1)
      res = res * a % mod;
    a = a * a % mod;
    n >>= 1;
  }
  return res;
}
const ll mod = 998244353;
vector<ll> fac(300001); // n!(mod M)
vector<ll> ifac(300001);
ll mpow(ll x, ll n) // 高速なべき乗計算 二分累乗法
{
  ll ans = 1;
  while (n != 0)
  {
    if (n & 1)
      ans = ans * x % mod;
    x = x * x % mod;
    n = n >> 1;
  }
  return ans;
}
ll comb(ll a, ll b) // 高速な組み合わせ計算 preparecombで初期化してから使う //もしa,bが負の値だとバグる
{
  if (a == 0 && b == 0)
    return 1;
  if (a < b || a < 0)
    return 0;
  ll tmp = ifac[a - b] * ifac[b] % mod;
  return tmp * fac[a] % mod;
}
void preparecomb() // 3e5まで対応 階乗をあらかじめ計算しておく
{
  fac[0] = 1;
  ifac[0] = 1;
  for (ll i = 0; i < 300000; i++)
  {
    fac[i + 1] = fac[i] * (i + 1) % mod;
    ifac[i + 1] = ifac[i] * mpow(i + 1, mod - 2) % mod;
  }
}
struct edge
{
  ll cost;
  ll u;
  ll v;
  edge(ll a, ll b, ll c) : cost(a), u(b), v(c) {}
};
struct edgecompare
{
  bool operator()(const edge &a, const edge &b) const
  {
    return a.cost > b.cost; // min-heapにするので不等号は>向き
  }
};
void cincout()
{
  ios::sync_with_stdio(false);
  std::cin.tie(nullptr);
  cout << fixed << setprecision(15);
}
using namespace atcoder;
using mint = modint998244353;
//  問題を言い換えてみる?
//  何が分かればいい?
//  どう更新するか
int ran(ll i)
{
  mt19937_64 mt64(i);
  return mt64();
}
using mint = modint998244353;
int main()
{
  ll r, p, q;
  cin >> r >> p >> q;
  ll a, b, c, d;
  cin >> a >> b >> c >> d;
  ll ok = -1, ng = infinity;
  auto judge = [&](ll mid) -> bool
  {
    if (mid * 3 > a + b + c + d)
    {
      return false;
    }
    ll cost = mid * p;
    ll cnt = max(0ll, mid - a) + max(0ll, mid - b) + max(0ll, mid - c);
    cost += cnt * q;
    if (cost <= r)
    {
      return true;
    }
    return false;
  };
  while (ok + 1 < ng)
  {
    ll mid = (ok + ng) / 2;
    if (judge(mid))
    {
      ok = mid;
    }
    else
    {
      ng = mid;
    }
  }
  cout << ok << endl;
}
0