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(分组背包)相关的知识,希望对你有一定的参考价值。

LINK

转化题意后就是给定 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