CF163D Large Refrigerator

题目

https://codeforces.com/contest/163/problem/D

题意

给定一个体积为V的长方体,求出该长方体表面积的最小值
表面积公式\(2*(ab+bc+ac)\)
输入有点奇怪 使用质因数的方法输入的
V=\({p_1}^{a_1}{p_2}^{a_2}{p_3}^{a_3}...{p_n}^{a_n}\)

题解

\(∵abc=V\)
\(∴bc=\frac{V}{a}\)
\(∴\frac{1}{2}S=ab+bc+ac=a(b+c)+\frac{V}{a}\)
\(均值不等式:a+b\geq2\sqrt{ab}, a,b\geq0\)
\(∴a(b+c)\geq2a\sqrt{bc}=2a\sqrt{\frac{V}{a}}\)
\(∴\frac{1}{2}S\geq2a\sqrt{\frac{V}{a}}+\frac{V}{a}\)
\(∴a\leq\sqrt[3]{V},b\sqrt{\frac{V}{a}}\)
所以爆搜a得到合法a后 爆搜b 然后\(c=\frac{V}{ab}\)

代码

#include<bits/stdc++.h>
using namespace std;
using ll=long long;
const ll maxn=1e5+5;
const ll maxm=2e9;
const ll inf=8e18;
ll n,m,r;
ll p[maxn],w[maxn],ww[maxn],q[maxn],g[maxn][30],u[maxn],P[maxn];
ll v,a,b,c,ans;
void dfs1(ll dep,ll x)
{
	if(dep==n)
	{
		for(ll j=0;j<n;j++)
			g[r][j]=u[j];
		P[r]=r;
		q[r++]=x;
		return ;
	}
	for(ll j=0;j<=w[dep];j++)
	{
		u[dep]=j;
		dfs1(dep+1,x);
		if(j<w[dep]&&x<=maxm/p[dep])
			x*=p[dep];
		else
			break;
		if(x>v/x/x)
			break;
	}
	return ;
}
void dfs2(ll dep,ll x,ll y,ll z)
{
	if(dep==n)
	{
		if(x>=y)
		{
			z/=x;
			ll tmp=x*y+y*z+z*x;
			if(tmp<ans)
			{
				ans=tmp;
				a=x;
				b=y;
				c=z;
			}
		}
		return ;
	}
	for(ll j=0;j<=ww[dep];j++)
	{
		dfs2(dep+1,x,y,z);
		if(j<ww[dep]&&x<=maxm/p[dep])
			x*=p[dep];
		else
			break;
		if(x>z/x)
			break;
	}
	return ;
}
bool cmp(ll a,ll b)
{
	return q[a]<q[b];
}
int main()
{
	ll t;
	cin>>t;
	while(t--)
	{
		v=1;
		cin>>n;
		for(ll i=0;i<n;i++)
		{
			cin>>p[i]>>w[i];
			for(ll j=1;j<=w[i];j++)
				v*=p[i];
		}
		ans=inf;
		r=0;
		dfs1(0,1);
		sort(P,P+r,cmp);
		for(ll num=r-1;num>=0;num--)
		{
			ll i=P[num];
			double x=sqrt(v*1.0/q[i]);
			if(2*q[i]*x+x*x>=ans)
				continue;
			for(ll j=0;j<n;j++)
				ww[j]=w[j]-g[i][j];
			dfs2(0,1,q[i],v/q[i]);
		}
		cout<<ans*2<<" "<<a<<" "<<b<<" "<<c<<"\n";
	}
	return 0;
}
posted @ 2021-03-03 23:40  mushroom_spy  阅读(78)  评论(0)    收藏  举报