HDU_5734_数学推公式
题意:给一个向量W={w1,w2……,wn},和一个向量B,B的分量只能为1和-1。求||W-αB||²的最小值。
思路:一来一直在想距离的问题,想怎么改变每一维的值才能使这个向量的长度最小,最后无果。
看了题解说是推公式,并且将结果看作是方差,这样W中的负值可直接转化为正值,也即将B所有分量当作1(这里需要想一下),所以只需要看α,当结果为方差时最小,也即α为均值,根据||x||=√∑xi²,将平方项展开,观察思考一下应该可以化解为(n∑wi²-sum²)/n
#include<iostream> #include<cstdio> #include<algorithm> #include<queue> #include<vector> #include<cstring> #include<string> #include<algorithm> #include<cmath> using namespace std; long long gcd(long long a,long long b) { if(a==0) return b; if(b==0) return a; if(a<b) { long long term=a; a=b; b=term; } while(a%b) { long long mo=a%b; a=b; b=mo; } return b; } int main() { int t; scanf("%d",&t); while(t--) { int n; scanf("%d",&n); long long sum=0,ans1=0,ans2=n,num; for(int i=0;i<n;i++) { scanf("%I64d",&num); if(num<0) num*=-1; sum+=num; ans1+=n*num*num; } ans1-=sum*sum; //cout<<"*"<<endl; long long tmp=gcd(ans1,ans2); //cout<<ans1<<"*"<<ans2<<endl; printf("%I64d/%I64d\n",ans1/tmp,ans2/tmp); } return 0; }