zoukankan      html  css  js  c++  java
  • 数字对【数论】

    题目大意:
    对于一个数字对(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;
    }
  • 相关阅读:
    发布(Windows)
    Parallel并行编程
    query通用开源框架
    深入了解三种针对文件(JSON、XML与INI)的配置源
    GitLab CI
    雅思创始人Keith Taylor谈英语学习
    查看内存使用情况
    Reverse String
    分布式消息系统jafka快速起步(转)
    深入浅出 消息队列 ActiveMQ(转)
  • 原文地址:https://www.cnblogs.com/hello-tomorrow/p/9313036.html
Copyright © 2011-2022 走看看