向量(高级的随机化应用)

第5题     向量 查看测评数据信息

向量(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,这样就可以求出答案了。(数据大就没了)

 

 


做法二:
极角排序:

暂时不会

posted @ 2024-08-20 08:20  cn是大帅哥886  阅读(117)  评论(0)    收藏  举报