srm 302 div2 1000(简单题,bfs,dp)

题意:
对于一个大于等于4的数K,可以加上它的一个因子(1,K除外)得到另一个数。
给N和M(N小于等于M),求从N到M的最小操作次数。
思路:
因为 M<=100000 ,枚举因子是 sqrt(K)
所以怎么搞都好啦~~

class DivisorInc
{
        public:
        int countOperations(int N, int M)
        {
        memset(f, 0xff, sizeof(f));
        f[N] = 0;
        for (int i=N+2;i<=M;++i) {
            int last = sqrt(i), tmp = inf;
            for (int j=last;j>=2;--j) if (i%j == 0) {
                if (i/j >= 3) {
                    int from = i - j;
                    if (f[from] != -1) {
                        tmp = min (tmp, f[from]+1);
                    }
                }
                if (j >= 3) {
                    int from = i - i/j;
                    if (f[from] != -1) {
                        tmp = min (tmp, f[from]+1);
                    }
                }
            }
            if (tmp < inf) f[i] = tmp;
        }
        return f[M];
        }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值