hdu-1058(动态规划)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1058

题意:求只由2,3,5,7的乘积组成的数,输出格式见output

思路:开始想打表,后来打表超时。因为数据太大了10^9,所以可以考虑用已知的2,3,5,7来推出之后的数,而不是

逐个数判断。

dp思路:从1开始找2,3,5,7倍数中最小的那个,每次找一下哪个数乘了一次,那个数的指针+1;

注意:输出格式中11,12,13,不是st,nd,rd。

参考文章:https://blog.csdn.net/ydm1234/article/details/51534932

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
typedef long long LL;
LL dp[100100];
int main(void)
{
    int i,n,a=1,b=1,c=1,d=1;
    dp[1]=1;
    for(i=2;i<=5842;i++)
    {
        dp[i]=min(dp[a]*2,min(dp[b]*3,min(dp[c]*5,dp[d]*7)));
        if(dp[i]==dp[a]*2) a++;
        if(dp[i]==dp[b]*3) b++;
        if(dp[i]==dp[c]*5) c++;
        if(dp[i]==dp[d]*7) d++;
    }
    while(~scanf("%d",&n)&&n)
    {
        int tp=n%10,t=n%100;
        printf("The ");
        if(tp==1&&t!=11) printf("%dst",n);
        else if(tp==2&&t!=12) printf("%dnd",n);
        else if(tp==3&&t!=13) printf("%drd",n);
        else printf("%dth",n);
        printf(" humble number is %lld.\n",dp[n]);
    }
    return 0;
 } 

猜你喜欢

转载自www.cnblogs.com/2018zxy/p/9748061.html