来源:Violet_II T1
好神的一题,我竟然没做出来QAQ
首先我们发现,答案是sigma(x[i]*x[j], i>j)+sigma(y[i]*y[j], i>j)。显然只需要讨论左边的就行了,右边就可以同理了。
我们发现sigma(x[i]*x[j], i>j)=(sigma(x[i])^2-sigma(x[i]^2))/2,减号后边和除以2显然是常数也就是说确定了x[i]也就确定了值。但是x[i]的值有哪些可以取呢?我们发现在sigma(x[i]*x[j], i>j)中,因为x[j]的取值与x[i]无关,所以对于x[i],假定所有i>j都确定了,那么也就是x[i]*sigma(x[j]),所以这是一个一次函数,我们对他取极值就行了。那么x[i]的值我们确定了,就是给定数据的x[i]或-x[i]。
那么问题转化为求最小的|sigma(x[i])|,注意这是绝对值。
我们考虑像背包那样,d[i][j]表示前i个物体,体积为j是否能被取到,那么
d[i][j+a[i]]=1 当 d[i-1][j]=1
d[i][j-a[i]]=1 当 d[i-1][j]=1
初始化 d[0][0]=1
那么就行了。。。。
好神。。
#include #include #include #include #include #include #include