向量(高级的随机化应用)
向量(x1,y1)和向量(x2,y2)的加法是向量运算的基本操作之一。在二维平面上,向量(x1,y1)表示从原点(0,0)到点(x1,y1)的有向线段,而向量(x2,y2)表示从原点(0,0)到点(x2,y2)的有向线段。当我们将这两个向量相加时,我们得到一个新的向量,其坐标是这两个向量坐标的对应分量之和。具体地,向量(x1,y1)和向量(x2,y2)的和向量的坐标是(x1+x2,y1+y2).这个新的向量(x1+x2,y1+y2)表示从原点(0,0)到点(x1+x2,y1+y2)的有向线段。例如,向量(2,3)和向量(1,-1)的和是(2+1,3+(-1)),即(3,2)。给定n个向量,选出一些向量使得它们和的模长最大。求最大的模长。向量的模长(或称为向量的长度、大小、绝对值)是一个非负实数,表示向量在空间中“伸展“的程度。对于二维平面上的向量(x,y),其模长计算公式为:模长=sqrt(x^2+y^2)。
输入格式
第一行一个数n
接下来n行,每行两个整数x[i],y[i],表示一个向量。
1<=n<=100,-1000000<=x[i]<=1000000,-1000000<=y[i]<=1000000
输出格式
一个数,保留一位小数。
输入/输出例子1
输入:
3
0 10
5 -5
-5 -5
输出:
10.0
样例解释
无
做法一:
注意到 n 的范围比较小,可以考虑背包
f(i, j): 对于x向量,考虑前i个向量,选j个,满足是最大模长的前提下,x的和(这里不是最大模长,而是x的和,因为方便后面计算)
g(i, j): 对于y向量,考虑前i个向量,选j个,满足是最大模长的前提下,y的和(同上)
转移:选和不选
不选:f(i, j)=f(i-1, j), g(i, j)=g(i-1, j)
选:选了当前x,y,要满足是最大模长,才进行转移: f(i, j)=f(i-1, j-1)+x, g(i, j)=g(i-1, j-1)+y
答案:max(f[n][i]),其中i<=n
但是由于向量的顺序不一样,会导致求出的答案出错。(dp是全局最优性,而本题是局部最优性,这两个不匹配)
错误例子:
输入:
4
29 -74
-81 -11
63 73
-100 -13
输出:
182.6
模拟一下,易得,
f[1][0]:0.0
f[2][0]:0.0 f[2][1]:-81.0
f[3][0]:0.0 f[3][1]:63.0 f[3][2]:-52.0
f[4][0]:0.0 f[4][1]:-100.0 f[4][2]:-52.0 f[4][3]:-152.0
g[1][0]:0.0
g[2][0]:0.0 g[2][1]:-11.0
g[3][0]:0.0 g[3][1]:73.0 g[3][2]:-85.0
g[4][0]:0.0 g[4][1]:-13.0 g[4][2]:-85.0 g[4][3]:-98.0
答案是错的,得出的是180.9
但是发现,把序列改成:
29 -74
-81 -11
-100 -13
63 73
f[1][0]:0.0
f[2][0]:0.0 f[2][1]:-100.0
f[3][0]:0.0 f[3][1]:-100.0 f[3][2]:-71.0
f[4][0]:0.0 f[4][1]:-100.0 f[4][2]:-181.0 f[4][3]:-152.0
g[1][0]:0.0
g[2][0]:0.0 g[2][1]:-13.0
g[3][0]:0.0 g[3][1]:-13.0 g[3][2]:-87.0
g[4][0]:0.0 g[4][1]:-13.0 g[4][2]:-24.0 g[4][3]:-98.0
那么dp出来就是对的了。答案是182.6
所以我们可以多次随机化,再对每一次随机化后的向量进行 dp,这样就可以求出答案了。(数据大就没了)
做法二:
极角排序:
暂时不会