分析:
给出一个已知向量W = ( w1, w2, …, wn ),和一个不确定向量B = ( b2, b2, …, bn )(bi ∈{+1, -1}),还有一个缩放因子α≥0。求||W-αB||^2的最小值
Note: ||X|| = √x1^2+⋯+xn^2 (X= x1, x2, …,xn)题解:
把表达式||W-αB||^2扩展开得到(w1^2+…+wn^2)+(n×α^2) - 2×α×(w1b1+…+wnbn),若使表达式的值最小,因为前面两项的值都是固定的,所以需要使后面哪项的值最大,即向量B的作用是把向量W取绝对值,所以第三项变成2×α×(w1+ … +wn),所以原式变成A×α^2 - 2×B×α + C的二元一次方程,求其最小值即当α = B/A时原表达式的值为C-B^2/A,(A = n, B = ∑wi,C = ∑wi^2)。总结:
这类数学题要针对其数学表达式入手,多化简,减少计算量。AC代码:
#include<iostream>
#include<cmath>
using namespace std;
int w[100050];
long long Gcd(long long a,long long b)
{
return b==0 ? a : Gcd(b, a%b);
}
int main()
{
int T;
cin>>T;
while(T--)
{
int n;
cin>>n;
long long sum=0;
long long he=0;
for(int i=1;i<=n;i++)
{
cin>>w[i];
sum+=(w[i]*w[i]);
he+=abs(w[i]);
}
long long fenzi=sum*n-he*he;
long long fenmu=n;
if(fenzi==0)
cout<<"0/1"<<endl;
else
{
long long gcd=Gcd(fenzi,fenmu);
fenzi/=gcd;
fenmu/=gcd;
cout<<fenzi<<'/'<<fenmu<<endl;
}
}
}