簽到題:game23(動態規劃)

題面

東東在玩遊戲“Game23”。
在一開始他有一個數字n,他的目標是把它轉換成m,在每一步操作中,他可以將n乘以2或乘以3,他可以進行任意次操作。輸出將n轉換成m的操作次數,如果轉換不了輸出-1

輸入的唯一一行包括兩個整數n和m(1<=n<=m<=5*108)
輸出從n轉換到m的操作次數,否則輸出-1

sample input1:
120 51840

sample output1:
7

sample input2:
42 42

sample output2:
0

sample input3:
48 72

sample output3:
-1

思路:

  • 不要將思路侷限在乘多少步能實現值上,根據除法來想就很容易找到邊界條件
  • 因爲2 3 都是素數,所以直接用整除來判斷就可以,還是比較方便的
  • 如果m不能整除n的,則直接不可能有方案,輸出-1即可
  • 如果可以,開始m/n整除2和3 ,每次除法相當於一步,step++
  • 如果m/n無法整除2和3,則說明無法實現,直接輸出-1
  • 如果最終m/n通過整除2和3變爲1,則實現了整除操作,輸出step即可
#include<stdio.h>
#include<string.h>
#include<iostream>
using namespace std;
int main()
{
 long long n,m;
 int step=0;
 scanf("%lld%lld",&n,&m);
 if(m%n!=0) 
 {
  printf("-1\n");
  return 0;
 }
 else
 {
  m=m/n;
  while(m!=1)
  {
   if(m%2==0)
   {
    step++;
    m=m/2;
    continue;
   }
   if(m%3==0)
   {
    step++;
    m=m/3;
    continue;
   }
   printf("-1\n");
   return 0;
  }
 }
 printf("%d\n",step);
 return 0;
} 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章