题解:【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);
}
posted @ 2023-03-13 14:40  LgxTpre  阅读(45)  评论(0编辑  收藏  举报