POJ 2247 小DP?

题意:定义H***数为质因子仅有2、3、5、7的数以及1,将所有的H***数排序,输出序列中第n个H***数。

说是DP。。也看不出来啥DP的特征,Openjudge是把这题分到DP一类里了。因为H***数仅由特定的质因子构成,所以每一个H***数都可以由已知的H***数乘2、3、5、7得来。我们预处理出数据范围n以内的所有H***数,O(1)查询。处理方式很简单,代码易懂。

唯一比较恶心的就是这道题的输出方式,考验英语基本功。→.→

#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;

int n, p2, p3, p5, p7, f[5845];

int main()
{
    f[1] = n = p2 = p3 = p5 = p7 = 1;
    while(n < 5845)
    {
        f[++n] = min(min(f[p2]*2, f[p3]*3), min(f[p5]*5, f[p7]*7));
        if(f[n]==f[p2]*2) p2++;
        if(f[n]==f[p3]*3) p3++;
        if(f[n]==f[p5]*5) p5++;
        if(f[n]==f[p7]*7) p7++;
    }

    while(scanf("%d", &n) && n)
    {
        printf("The %d",n);
        if      (n%10==1 && n/10%10!=1) printf("st");
        else if (n%10==2 && n/10%10!=1) printf("nd");
        else if (n%10==3 && n/10%10!=1) printf("rd");
        else                            printf("th");
        printf(" humble number is %d.\n",f[n]);
    } 

    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值