結果
| 問題 | No.3681 心の沸騰石 |
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2026-09-07 10:44:34 |
| 言語 | C++23(gcc16) (gcc 16.1.0 + boost 1.92.0 + ACL) |
| 結果 |
WA
不安定
|
| 実行時間 | - |
| コード長 | 5,396 bytes |
| 記録 | |
| コンパイル時間 | 4,441 ms |
| コンパイル使用メモリ | 388,020 KB |
| 実行使用メモリ | 8,320 KB |
| 最終ジャッジ日時 | 2026-09-07 10:44:44 |
| 合計ジャッジ時間 | 5,898 ms |
|
ジャッジサーバーID (参考情報) |
judge3_0 / judge2_1 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 4 |
| other | AC * 12 WA * 1 |
ソースコード
#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 = 0, ng = 1e9;
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;
}