CSES - Removing Digits II | Loại bỏ chữ số II

Xem PDF



Tác giả:
Dạng bài
Ngôn ngữ cho phép
Assembly, Awk, C, C++, Clang, Clang++, Cobol, D, Groovy, Haskell, Java, JS, Kotlin, Lua, Node JS, ObjectiveC, Output, Pascal, Perl, Prolog, Pypy, Pypy 3, Python, Scala, Scratch
Điểm: 2500 (p) Thời gian: 1.0s Bộ nhớ: 512M Input: bàn phím Output: màn hình

Cho một số nguyên \(n\). Mỗi bước, bạn có thể trừ bất kỳ số có một chữ số nào xuất hiện trong đó.

Cần thực hiện mấy bước để số đó bằng \(0\)?

Input

  • Một dòng duy nhất chứa số nguyên \(n\).

Output

  • Một dòng duy nhất chứa số bước thực hiện ít nhất.

Constraints

  • \(1\leq n \leq 10^{18}\)

Example

Sample input

27

Sample output

5

Note

  • Giải thích: Cách làm tối ưu là \(27 \rightarrow 20 \rightarrow 18 \rightarrow 10 \rightarrow 9 \rightarrow 0\).

Bình luận


  • 0
    rock    8:16 a.m. 25 Tháng 10, 2024

    Uses math;

    const
    MAXN = 1000005;

    var
    dp: array[1..19, 0..9, 0..9] of Int64;
    trace: array[1..19, 0..9, 0..9] of Int64;
    pw: array[0..19] of Int64;
    i:Longint;
    result:Int64;
    procedure CreateDP;
    var
    i, j, k, l: Longint;
    res, trc: Int64;
    begin
    pw[0] := 1;
    for i := 1 to 18 do
    pw[i] := pw[i-1] * 10;

    for i := 1 to 18 do
    begin
    if (i = 1) then
    begin
    for j := 0 to 9 do
    begin
    for k := 9 downto 0 do
    begin
    if ((9 - k) - Max(j, 9 - k) < 0) then
    begin
    dp[i][j][k] := 1;
    trace[i][j][k] := -((9 - k) - Max(j, 9 - k));
    end
    else
    begin
    dp[i][j][k] := dp[i][j][9 - ((9 - k) - Max(j, 9 - k))] + 1;
    trace[i][j][k] := trace[i][j][9 - ((9 - k) - Max(j, 9 - k))];
    end;
    end;
    end;
    end
    else
    begin
    for j := 0 to 9 do
    begin
    for k := 0 to 9 do
    begin
    trc := k + 1;
    res := 0;
    for l := 9 downto 0 do
    begin
    res := res + dp[i-1][Max(j, l)][trc-1];
    trc := trace[i-1][Max(j, l)][trc-1];
    end;
    dp[i][j][k] := res;
    trace[i][j][k] := trc;
    end;
    end;
    end;
    end;
    end;

    function GetTCS(n: Int64): Int64;
    var
    ans: Int64;
    begin
    ans := 0;
    while (n > 0) do
    begin
    ans := Max(ans, n mod 10);
    n := n div 10;
    end;
    Result := ans;
    Exit(result);
    end;

    function GetAns(n: Int64): Int64;
    var
    k: Integer;
    ans, x, z: Int64;
    begin
    k := 1;
    ans := 0;
    while (n > 0) do
    begin
    x := n mod pw[k+1] div pw[k];
    for i := 0 to x do
    begin
    z := GetTCS(n div pw[k]);
    ans := ans + dp[k][z][pw[k] - n mod pw[k] - 1];
    n := n - n mod pw[k] - trace[k][z][pw[k] - n mod pw[k] - 1];
    end;
    k := k + 1;
    end;
    Result := ans - 1;
    Exit(result);
    end;

    var
    n: Int64;
    begin
    CreateDP();
    ReadLn(n);
    WriteLn(GetAns(n));
    end.(pascal)

    • 12 bình luận nữa