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;
}

浙公网安备 33010602011771号