L. Clock Master

数论+分组背包
打表找一找规律就发现了,我们不过是求这一个数组的最小公倍数,想办法让其最大
然后我们运用分组背包的想法,肯定里面的数互素的情况下才好。

#include<iostream>
#include<algorithm>
#include<cmath>
using namespace std;
typedef long long ll;
const int max_n = 31000;
int a[max_n];
double dp[3500][max_n];
bool used[max_n];
int tot=0;
double b[3500];

void init()
{
    for (int i=2;i<max_n;++i)
    {
        if (used[i])continue;
        for (int j=i+i;j<max_n;j+=i)
        {
            used[j]=1;
        }
        a[++tot]=i;
    }
    for (int i=1;i<=tot;++i)
    {
        b[i]=log(a[i]);
    }
}
int main()
{
    ios::sync_with_stdio(0);
    init();
    int n = 30000;
    for (int i=1;i<=tot;++i)
    {
        for (int j=1;j<=n;++j)
        {
            dp[i][j]=dp[i-1][j];
            int ex1=a[i];
            double ex2=b[i];
            while (j-ex1>=0)
            {
                dp[i][j]=max(dp[i][j],dp[i-1][j-ex1]+ex2);
                ex1*=a[i];
                ex2+=b[i];
            }
        }
    }
    int T;scanf("%d",&T);
    while (T--)
    {
        scanf("%d",&n);
        printf("%0.12llf\n",dp[tot][n]);
    }
}
全部评论

相关推荐

09-09 21:23
门头沟学院 Java
程序员牛肉:小牛肉来也! 主要就是没有实习经历。因为你的投递方向肯定是中小厂。在小厂中,很少会有公司愿意花钱培养你。因此会更加青睐有实习的同学。再加上你的学历比较差一点,所以找不到是正常的。 跟简历项目啥的已经没有大关系了,就是差一份实习。秋招和日常实习一起投递吧。
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务