题目描述
ps:这道题说白了就是一个思维题,首先针对题目所给出的式子我们需要先化简,首先假设有路径上有n个点,先将累加符号去掉,全部加起来,得到
−
n
x
2
+
(
b
1
+
b
2
+
.
.
+
b
n
)
∗
x
∣
V
∣
\frac{-nx^{2}+(b1+b2+..+bn)*x}{|V|}
∣V∣−nx2+(b1+b2+..+bn)∗x,然后因为|V|等于n,所以在化简变为
−
x
2
+
b
1
+
b
2
+
.
.
+
b
n
n
∗
x
-x^{2}+\frac{b1+b2+..+bn}{n}*x
−x2+nb1+b2+..+bn∗x,然后就可以直接求出最大值为
(
b
1
+
b
2
+
.
.
+
b
n
n
)
2
4
\frac{(\frac{b1+b2+..+bn}{n})^{2}}{4}
4(nb1+b2+..+bn)2,然而它的思维在于这个点的数量其实只能式2个或3个,因为一旦超过四个,我们一定就可以将这条路径从中间断开然后选择均值较大的那一边,因为我们的结果只与均值有关,并且一定有一边均值要大于总体,所以一定可以断开使得结果更优,上代码
#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<vector>
using namespace std;
const int N=1e5+10;
int w[N];
vector<int> g[N];
int n;
double solve()
{
for(int i=1;i<=n;i++)sort(g[i].begin(),g[i].end());
double res=0;
for(int i=1;i<=n;i++)
{
int sz=g[i].size();
res=max(res,1.0*(g[i][sz-1]+w[i])*(g[i][sz-1]+w[i])/4);
res=max(res,1.0*(g[i][0]+w[i])*(g[i][0]+w[i])/4);
if(sz>=2)
{
res=max(res,1.0*(g[i][sz-1]+g[i][sz-2]+w[i])*(g[i][sz-1]+g[i][sz-2]+w[i])/9);
res=max(res,1.0*(g[i][0]+g[i][1]+w[i])*(g[i][0]+g[i][1]+w[i])/9);
}
}
return res;
}
int main()
{
cin>>n;
for(int i=1;i<=n;i++)scanf("%d",&w[i]);
for(int i=0;i<n-1;i++)
{
int a,b;
scanf("%d%d",&a,&b);
g[a].push_back(w[b]),g[b].push_back(w[a]);
}
double res=solve();
printf("%.10lf\n",res/4);
return 0;
}