您的位置:首页 > 其它

HDU 1058 Humble Numbers(dp)

2015-08-17 11:26 453 查看
题目链接http://acm.hdu.edu.cn/showproblem.php?pid=1058

很巧妙的一个递推,因为只有2,3,5,7构成,那么后面的数一定是2,3,5,7的倍数,所以可以直接枚举那个最小,用四个变量来维护2,3,5,7分别算到几了。

dp【i】 = min(2 * dp[p2], 3 * dp[p3], 5 * dp[p5], 7 * dp[p7]);

/*************************************************************************
> File Name:            3.cpp
> Author:               Howe_Young
> Mail:                 1013410795@qq.com
> Created Time:         2015年08月17日 星期一 11时28分41秒
************************************************************************/

#include <cstdio>
#include <iostream>
#include <cstring>
#include <cmath>
#include <cstdlib>
#include <algorithm>
#define min3(a, b, c) min(a, min(b, c))
using namespace std;
typedef long long ll;

const int maxn = 10000;
ll d[maxn];
ll dp(ll a, ll b, ll c, ll n)
{
d[0] = 1;
int p1 = 0, p2 = 0, p3 = 0;
for (int i = 1; i <= n; i++)
{
d[i] = min3(a * d[p1], b * d[p2], c * d[p3]);
if (d[i] == a * d[p1]) p1++;
if (d[i] == b * d[p2]) p2++;
if (d[i] == c * d[p3]) p3++;
}
return d
;
}
int main()
{
ll p1, p2, p3, i;
while (~scanf("%I64d %I64d %I64d %I64d", &p1, &p2, &p3, &i))
{
printf("%I64d\n", dp(p1, p2, p3, i));
}
return 0;
}


View Code
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: