zoukankan      html  css  js  c++  java
  • HDU 1058 Humble Number

    题意大概是,2,3,5,7的和他们的整数倍数的数都称为Humble Number,将所有的Humble Number从小到大排列,现在输入N(N <= 5842)输出第N个Humble Number

    考虑到一个一个数是Humble Number,那么他的2,3,5,7倍一定也是HUmble Number,因此只要想办法处理怎么样让其从小到大一个一个输出就好。

    网上看到一个比较巧妙的办法,在这里记录下来

    设f(n)为第n个Humble Number

    那么有f(n) =  min(f(l1)*2,f(l2)*3,f(l3)*5,f(l4)*7),初始l1=l2=l3=l4=1

    处理完一个数之后相应的值往后挪一个

    #include <cstdio>
    #include <iostream>
    #include <cstring>
    #include <algorithm>
    
    using namespace std;
    
    typedef long long LL;
    
    #define min_t(a,b) (((a)<(b))?(a):(b))
    
    LL min(LL a,LL b,LL c,LL d) {
        return min_t(min_t(a,b),min_t(c,d));
    } 
    
    LL dp[6000];
    
    void init() {
        int l1 = 1,l2 = 1,l3 = 1,l4 = 1;
        dp[1] = 1;
        for(int i = 2;i <= 5842;i++) {
            dp[i] = min(dp[l1] * 2,dp[l2] * 3,dp[l3] * 5,dp[l4] * 7);
            if(dp[i] == dp[l1] * 2) l1++;
            if(dp[i] == dp[l2] * 3) l2++;
            if(dp[i] == dp[l3] * 5) l3++;
            if(dp[i] == dp[l4] * 7) l4++;
        }
    }
    
    int main() {
        int n;
        init();
        while(scanf("%d",&n),n) {
            cout << "The " << n;
            if(n % 100 / 10 == 1) cout << "th";
            else if(n % 10 == 1) cout << "st";
            else if(n % 10 == 2) cout << "nd";
            else if(n % 10 == 3) cout << "rd";
            else cout << "th";
            cout << " humble number is " << dp[n] << "." << endl;
        }
        return 0;
    }
  • 相关阅读:
    CNN comprehension
    Gradient Descent
    Various Optimization Algorithms For Training Neural Network
    gerrit workflow
    jenkins job配置脚本化
    Jenkins pipeline jobs隐式传参
    make words counter for image with the help of paddlehub model
    make words counter for image with the help of paddlehub model
    git push and gerrit code review
    image similarity
  • 原文地址:https://www.cnblogs.com/rolight/p/3606358.html
Copyright © 2011-2022 走看看