結果

問題 No.3537 Thank You!
コンテスト
ユーザー tobisatis
提出日時 2026-05-08 22:14:48
言語 C#
(.NET 10.0.201)
コンパイル:
dotnet_c
実行:
/usr/bin/dotnet_wrap
結果
AC  
実行時間 161 ms / 2,000 ms
コード長 1,777 bytes
記録
記録タグの例:
初AC ショートコード 純ショートコード 純主流ショートコード 最速実行時間
コンパイル時間 13,066 ms
コンパイル使用メモリ 176,836 KB
実行使用メモリ 224,124 KB
最終ジャッジ日時 2026-05-08 22:15:07
合計ジャッジ時間 18,711 ms
ジャッジサーバーID
(参考情報)
judge3_1 / judge2_0
このコードへのチャレンジ
(要ログイン)
サブタスク 配点 結果
サブタスク1 30 % AC * 21
サブタスク2 70 % AC * 15
合計 2.5 * 100% = 250 点
権限があれば一括ダウンロードができます
コンパイルメッセージ
  復元対象のプロジェクトを決定しています...
  /home/judge/data/code/main.csproj を復元しました (89 ミリ秒)。
  main -> /home/judge/data/code/bin/Release/net10.0/main.dll
  main -> /home/judge/data/code/bin/Release/net10.0/publish/

ソースコード

diff #
raw source code

#nullable enable

#region
var (_input, _iter) = (Array.Empty<string>(), 0);
T I<T>() where T : IParsable<T>
{
    while (_iter >= _input.Length) (_input, _iter) = (Console.ReadLine()!.Trim().Split(' '), 0);
    return T.Parse(_input[_iter++], null);
}
#endregion

static T[] Range<T>(int n, Func<T> F) => Enumerable.Range(0, n).Select(_ => F()).ToArray();

var n = I<int>();
var b = I<int>();
var cz = Range(n, I<int>);
var sz = Range(n, I<int>);
var iz = Enumerable.Range(0, n).ToArray();
iz.AsSpan().Sort((x, y) => {
    var cx = cz[x];
    var cy = cz[y];
    var cc = cx.CompareTo(cy);
    if (cc != 0) return cc;
    var sx = sz[x];
    var sy = sz[y];
    return sy.CompareTo(sx);
});

long Solve(int x)
{
    var cards = new List<(int, int)>();
    for (var i = 0; i < n; i++)
    {
        var c = cz[i];
        var s = sz[i];
        if (i == x) cards.Add((1, s));
        else cards.Add((c, s));
    }
    cards.Sort();
    var res = 0L;
    long b0 = b;
    foreach (var (c, s) in cards)
    {
        var u = Math.Min(s, b0 / c);
        res += u;
        b0 -= u * c;
    }
    return res;
}

var j = 0;
{
    long b0 = b;
    while (j < n && b0 > 0)
    {
        var c = cz[iz[j]];
        if (b0 < c) break;
        var s = sz[iz[j]];
        b0 -= (long)c * s;
        if (b0 <= 0) break;
        j++;
    }
}
if (j == n)
{
    Console.WriteLine(Solve(0));
    return;
}
var (li, ri) = (-1, -1);
var (lv, rv) = (-1L, -1L);
for (var i = 0; i < j; i++)
{
    var c = cz[iz[i]];
    var s = sz[iz[i]];
    var p = (long)(c - 1) * s;
    if (p > lv) (li, lv) = (iz[i], p);
}
for (var i = j + 1; i < n; i++)
{
    var s = sz[iz[i]];
    if (s > rv) (ri, rv) = (iz[i], s);
}
var ans = Math.Max(Solve(iz[j]), Math.Max(Solve(li), Solve(ri)));
Console.WriteLine(ans);
0