Biến Đổi Nhanh Nhất


Submit solution

Points: 2
Time limit: 1.0s
Memory limit: 10M

Author:
Problem type
Allowed languages
Ada, Assembly, Awk, C, C++, C11, CLANG, CLANGX, Classical, COBOL, Coffee, CSC, D lang, DART, F95, FORTH, Fortrn, GAS32, GO, Haskell, Itercal, Java, kotlin, LEAN, LISP, LUA, MONOVB, Nasm, OCAML, Pascal, Perl, php, PIKE, prolog, Pypy, Python, Ruby 2, RUST, Scala, SCM, SED, SWIFT, TCL, TUR, V8JS, VB, ZIG

Cho hai số nguyên n, m. Hãy tìm số bước tối thiểu để biến đổi n thành m bằng 1 trong 2 cách sau:

  • Thay n thành n-1
  • Thay n thành n*2

Nếu không biến đổi được in ra màn hình ERROR

Input:

  • Dòng duy nhất gồm 2 số nguyên n,m (0<= n,m <=10^5)

Output:

  • Một số nguyên duy nhất là bước tối thiểu để biến đổi n thành m hoặc nếu không thể biến đổi thì in ra màn hình chứ ERROR.

Example 1:

Input:

2 3

Output:

2

Example 2:

Input:

-5 1

Output:

ERROR

Comments


  • 0
    ga123  commented on Oct. 5, 2021, 1:19 p.m.

    test 3 là 2 100, sao t tính tay ra 13 là min nhỉ: x=2, y=100

    • x*2 4 lần ra 32.
    • x-1 7 lần ra 25.
    • x*2 2 lần ra 100.

    ai giải thích t với .

    code đang sai test 3 đây:

    #include"stdio.h"
    #include"math.h"
    int main()
    {
    long x=2,y=100,test1,test2,dem=0,kq1,kq2,kq3,dp1,d=0;
    //scanf("%ld%ld",&x,&y);
    kq3=abs(y/2);
    dp1=y/2;
    if(x<0&&y>=0)
    {
        printf("ERROR");
        return 0;
    }
    //printf(" x | KQ1| KQ2|TEST 1|TEST 2\n");
    while(x!=y)
    {
        dp1=2*x;
        if(dp1==y) 
        {
        dem++;
    //  printf("\n\nKet qua cuoi cung :: %ld",dem); return 0;
        printf("\n\n%ld",dem); return 0;
        break;
        }
        else
        {
        test1 = x-1;
        test2 = x*2;
        kq1=abs(test1-y);
        kq2=abs(test2-y);
    //  printf("\n  %ld|   %ld|   %ld|     %ld|     %ld",x,kq1,kq2,test1,test2);
        if(x-dp1<2*x-y)
        {
    if(x<y)
    {
    //      printf("\n\nX th dc bt:%ld",x);
            x-=kq3;
    //      printf("\n\nCONg vao:%ld",x);
            dem+=x;
            dem++;
    }
    else
    {
        x-=y;
        dem+=x;
    }
    //  printf("\n\nKet qua cuoi cung :: %ld",dem); return 0;
        printf("\n\n%ld",dem); return 0;
        }
        else
        {
        if(kq1<=kq2) x=test1;
        if(kq1>kq2) x=test2;
        if(2*test1==y) x=test1;
        if(2*test2==y) x=test2;
        dem++;
    //  printf("\n\nDEM:  %ld",dem);
        }
        }
    }
    //  printf("\n\nKet qua cuoi cung :: %ld",dem); return 0;
        printf("\n\n%ld",dem); return 0;
    }

    • 1
      Hoan_CNTT_VA2_K61  commented on Oct. 5, 2021, 2:35 p.m.

      việc bao quát hết các trường hợp sẽ rất khó, vì vậy hãy nghĩ thuật toán

      còn giải thích #case 3: 2 100 cần ít nhất là 9 lần

      x*2 2 lần ra 8

      x-1 1 lần ra 7

      x*2 1 lần ra 14

      x-1 1 lần ra 13

      x*2 1 lần ra 26

      x-1 1 lần ra 25

      x*2 2 lần ra 100

      tổng là: 2+1+1+1+1+1+2=9 lần


      • 1
        ga123  commented on Oct. 5, 2021, 4:57 p.m.

        ok tks bạn