Acperience
题目链接
题目大意
给你两个个向量
W=(w1,w2...wn) B=(b1,b2...bn)(bi∈{+1,−1})
要求这个表达式的最小值:
ansmin=∑i=1n(wi−αbi)2
打开之后:
ansmin=∑i=1n(w2i−2αbiwi+α2b2i)
继续打开可以化简到
ansmin=nα2−[2∑(biwi)]⋅α+∑w2i
可以看到是一个2一元二次方程且开口向下,我们求其最小值:
ansmin=∑w2i−∑biwin
发现要使ans最小,我们使得 ∑biwi 最大就行了,最后通分算出结果。
代码
#include <iostream>
#include <cstring>
#include <cstdio>
#define LL long long
#define maxn 100005
using namespace std;
int T,a[maxn];
LL n;
LL gcd(LL a,LL b)
{
if (b==0) return a;
else return gcd(b,a%b);
}
int main()
{
scanf("%d",&T);
while (T--)
{
scanf("%I64d",&n);
LL sum=0,f=0;
for (int i=0;i<n;i++)
{
scanf("%d",&a[i]);
if (a[i]>0) sum+=a[i];
else sum-=a[i];
f+=(LL) (a[i]*a[i]);
}
sum=sum*sum;
f=n*f-sum;
LL c=gcd(f,n);
printf("%I64d/%I64d\n",f/c,n/c);
}
return 0;
}