2020 China Collegiate Programming Contest, Weihai Site L. Clock Master(分组背包)
Posted issue是fw
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了2020 China Collegiate Programming Contest, Weihai Site L. Clock Master(分组背包)相关的知识,希望对你有一定的参考价值。
转化题意后就是给定 n n n,要求分配成若干个数
使这些数字的最小公倍数最大
显然分配的数字是质数最好,所以可以对每个质数 x x x当作物品来选
但是对于一个质数 x x x,我们可以选 x x x,也可以选 x 2 , x 3 . . . . x^2,x^3.... x2,x3....
所以这是一个分组背包问题,暴力转移即可
#include <bits/stdc++.h>
using namespace std;
const int mx = 3e4;
const int maxn = 2e6+10;
int vis[maxn],prime[maxn],top;
void make_prime()
{
for(int i=2;i<=mx;i++)
{
if( !vis[i] ) prime[++top] = i;
for(int j=1;j<=top && prime[j]*i<=mx;j++)
{
vis[prime[j]*i] = 1;
if( i%prime[j]==0 ) break;
}
}
}
double f[2][mx+10],LN[mx+10];
int id;
int main()
{
make_prime();
int t; cin >> t;
for(int i=1;i<=30000;i++) LN[i] = log(i);
for(int i=1;i<=top;i++)
{
int t = i&1, v = t^1;
for(int u=0;u<=30000;u++) f[t][u] = f[v][u];
for(int j=prime[i];j<=30000;j*=prime[i] )
for(int u=j;u<=30000;u++)
f[t][u] = max( f[t][u],f[v][u-j]+LN[j] );
}
// for(int i=1;i<=30000;i++)
// f[top&1][i] = max( f[top&1][i],f[top&1][i-1] );
while( t-- )
{
int n; cin >> n;
printf("%.10lf\\n",f[top&1][n] );
}
}
以上是关于2020 China Collegiate Programming Contest, Weihai Site L. Clock Master(分组背包)的主要内容,如果未能解决你的问题,请参考以下文章
2020 China Collegiate Programming Contest, Weihai Site L. Clock Master(分组背包)
2020 China Collegiate Qinhuangdao Site F. Friendly Group(思维+边双连通)
2020 China Collegiate Programming Contest - Mianyang Site J. Joy of Handcraft(线段树模板)
2020 China Collegiate Programming Contest, Weihai Site C. Rencontre(lca+树形dp)
The 2019 China Collegiate Programming Contest Harbin Site
The 2019 China Collegiate Programming Contest Harbin Site F. Fixing Banners