Codeforces Testing Round #3 B. Pairs of Numbers【dfs】【枚舉】

題目鏈接:https://codeforc.es/problemset/problem/134/B
題目大意:假定我們有一個數對(a,b)(a,b),我們可以得到下一個新的數對(a+b,b)(a+b,b)或者(a,a+b)(a,a+b),初始數對爲(1,1)(1,1),問要得到一個數對中要有一個值爲nn,至少需要多少次操作。
思路:nn的範圍只是在1e61e6,所以我們可以假定答案爲(n,m),m<n(n,m),m<n,暴力枚舉mm,每次類似於輾轉相除法的形式計算次數。
AC代碼:

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int nn;
void dfs(int n,int m,int & cnt)
{
    if(m==1){//初始情況下,n是從1每次加1得到n的
        cnt+=n-1;
        return ;
    }
    if(m==0){//這種情況是不合法的,cnt賦不合法值直接返回
        cnt=nn;
        return ;
    }
    cnt+=n/m;
    n%=m;
    dfs(m,n,cnt);
}
int main()
{
    
    cin>>nn;
    int ans=nn-1;
    for(int i=1;i<nn;i++){
        int cnt=0;
        dfs(nn,i,cnt);
        ans=min(ans,cnt);
    }
    cout<<ans<<endl;
    return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章