题解:【ARC158B】 Sum-Product Ratio
先化一下:
\[\mathcal F(x_i,x_j,x_k) = \frac{x_i + x_j + x_k}{x_i x_j x_k} = \frac{1}{x_i x_j} + \frac{1}{x_i x_k} + \frac{1}{x_j x_k}
\]
记 \(t = \frac{1}{x}\),\(\mathcal G\) 是关于 \(t\) 的函数,为 \(\mathcal G(t_i,t_j,t_k) = t_i t_j + t_i t_k + t_j t_k\),有:
\[\mathcal G(t_i,t_j,t_k) = \mathcal F(x_i,x_j,x_k) = (t_i + t_j) t_k + t_i t_j
\]
容易得到当固定 \(t_i\) 和 \(t_j\) 的时候,\(\mathcal g\) 是关于 \(t_k\) 的一次函数。所以如果想要得到答案,\(t_k\) 的取值必然是所有数去掉 \(t_i\) 和 \(t_j\) 后取最大值和最小值。
类似的我们就可以得到 \(t_i\) 和 \(t_j\) 也一定要取极值。综上我们将 \(x\) 按照 \(\frac{1}{x}\) 的大小排序,取三个最大值和三个最小值,设他们从大到小依次分别为 \(a_1,a_2,a_3\) 和 \(b_1,b_2,b_3\),最后的答案一定在 \(\mathcal F(a_1,a_2,a_3)\),\(\mathcal F(a_1,a_2,b_3)\),\(\mathcal F(a_1,b_2,b_3)\),\(\mathcal F(b_1,b_2,b_3)\) 中。复杂度瓶颈在于排序。
#include<bits/stdc++.h>
#define int long long
using namespace std;
namespace LgxTpre
{
static const int MAX=200010;
static const int INF=4557430888798830399;
static const double inf=2147483647.0;
static const int mod=998244353;
int n,x;
double num[MAX];
double maxx,minx;
inline double func(double a,double b,double c) {return (a+b+c)/(a*b*c);}
inline void cmin(double &a,double b) {a=a<b?a:b;}
inline void cmax(double &a,double b) {a=a>b?a:b;}
inline void lmy_forever()
{
cin>>n;
for(int i=1;i<=n;++i) cin>>num[i];
sort(num+1,num+1+n,[](double x,double y)
{
return 1/x<1/y;
});
minx=inf,maxx=-inf;
cmin(minx,func(num[1],num[2],num[3])),cmin(minx,func(num[1],num[2],num[n])),
cmin(minx,func(num[1],num[n-1],num[n])),cmin(minx,func(num[n-2],num[n-1],num[n]));
cmax(maxx,func(num[1],num[2],num[3])),cmax(maxx,func(num[1],num[2],num[n])),
cmax(maxx,func(num[1],num[n-1],num[n])),cmax(maxx,func(num[n-2],num[n-1],num[n]));
cout<<fixed<<setprecision(15)<<minx<<endl;
cout<<fixed<<setprecision(15)<<maxx<<endl;
return;
}
}
signed main()
{
ios::sync_with_stdio(false);
cin.tie(0);
LgxTpre::lmy_forever();
return (0-0);
}