• 数字对【数论】


    题目大意:
    对于一个数字对(a,b),可以将其变为新数字对(a+b,b)(a,a+b)
    给定一正整数n,问最少需要多少次操作可将数字对(1,1)变为一个数字对,且该数字对有一个为n。


    思路:
    真的不会做啊。。。
    考试时想了bfsdfsDP,但是都至少是O(n2)的算法,对于n106根本吃不消。
    最后还是打了一个DP灰溜溜的交上去,30分。


    正解:数论,GCD

    有谁看得出这是GCD的题目???
    对于给定的n,我们可以枚举所有的i,模拟还原n,i,最终步数最少的就是最终解。
    这道题可以类比求gcd的辗转相除法。
    a>b,则gcda,b=gcd(amodb,b)
    ab,则gcda,b=(a,bmoda)
    当达到一定次数时,b=1,那么这就是一个合法的解。如果b=0时,b没有等于过1,那么这个解就不合法。


    代码:

    #include <cstdio>
    #include <iostream>
    using namespace std;
    
    int n,ans;
    
    int gcd(int a,int b)  //辗转相除法
    {
        if (!b) return 99999999;  //b到达0且没有等于过1,无解
        if (b==1) return a-1;  //b=1,有借
        return gcd(b,a%b)+a/b; 
    }
    
    int main()
    {
        scanf("%d",&n);
        ans=99999999;
        for (int i=1;i<=(n+1)/2+1;i++)  //简单精简。
         ans=min(ans,gcd(n,i));
        return printf("%d\n",ans)&0;
    }
  • 相关阅读:
    将maven项目托管到github
    HDOJ_1215_七夕节
    HDOJ_1108_最小公倍数
    HDOJ_1061_Rightmost Digit
    HDON_1021_Fibonacci Again
    HDOJ_1008_Elevator
    HDOJ_1235_统计同成绩学生人数
    HDOJ_2006_求奇数的乘积
    HDOJ_1201_18岁生日
    HDOJ_1019_大二写_Least Common Multiple
  • 原文地址:https://www.cnblogs.com/hello-tomorrow/p/9313036.html
Copyright © 2020-2023  润新知