zoj 1596

给出p1,p2,p3 ,求第k个大的由这三个数得到的数

动态规划的一个简单问题

第k个数是由前k-1个数中的一个乘p1,p2,p3中的一个得到的

故 用a,b,c来保存三个数取到了多少个

dp[i]=min(p1*dp[a],min(p2*dp[b],p3*dp[c]));

代码:

#include <stdio.h>
#include <string.h>
long long  p1,p2,p3,hi;
long long dp[10000];
long long mymin(long long a,long long b)
{
    return a>b?b:a;
}
int main()
{


    while(scanf("%lld %lld %lld %lld",&p1,&p2,&p3,&hi)!=EOF)
    {
        memset(dp,0,sizeof(dp));
        int a=0,b=0,c=0,num=0;
        dp[0]=1;
        while(1)
        {
            long long temp=mymin(p1*dp[a],mymin(p2*dp[b],p3*dp[c]));
            if(temp==p1*dp[a])
                a++;
            if(temp==p2*dp[b])
                b++;
            if(temp==p3*dp[c])
                c++;
            num++;
            dp[num]=temp;
            if(num==hi)
                break;
        }
        printf("%lld\n",dp[hi]);
    }
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值