您的位置:首页 > 编程语言 > Python开发

【py交易】算法竞赛入门经典5.4.4 多少块土地 python

2016-11-26 12:24 281 查看


分析:

1.题目不是太懂,看了一下网上的一些文章,其实跟题目讲的基本一样,所以还是不太懂。画个图比划比划就好多了

2.简单多面体的欧拉公式,记住就ok, V-E+F = 2 (Vertex,Edge,Face)

其中,这个Face是包含了椭圆面外的无限大平面,所以最后F = 2-V+E-1 = E-V+1,求出边数和定点数即可得出答案

3.最优方案:不会让任何3条线交于一点,这个提示很重要。严格的说,应该是在椭圆平面内不会3条线相交,不包含椭圆边界,不然跟题目就矛盾了(钻牛角尖)

4.有图有杰宝:



举个例子(不举)。。。椭圆边上有5个点,ABCDDE,n=5

假设以AC为对角线,对角线左边点的个数为 i,也就是B点;

则对角线右边的点个数为 (n-2-i),也就是D和E,其中减2就是AC两个点

此时,左边的B和右边的DE两两相连(注意:左边和右边本圈子内的不连,所以同位于右边的DE不连起来):

所以有线段BE、BD,在对角线AC上产生的新交点为k1,k2,数目为i(n-2-i)个(2);

在对角线上产线的新线段为AK1,K1K2,K2C,数目为i(n-2-i)+1条(3)

然后,以BE作为对角线,则左边为A点,右边为C、D点,然后重复上述步骤,发现在对角线BE上的新交点为S1,S2,新的线段为BS1,S1S2,S2E

此时可以注意到,K1和S1其实是重合的,所以这个点被算了两次(AC和BE个一次);然后,以CA(K1’,K2’)和EB(S1’,S2’)的为对角线的时候,这个点会又被算两次,所以在对角线上的一个点被算了4次,需要除以4!!!至于为什么不是6次8次呢,因为第3条分析说了:不会有3条线交于一个点,所以最多两条,然后4个点,thats it!

至于在对角线上产生的线段,在以AC为对角线的时候K1K2被算了一次,在以CA为对角线的时候,又算了一次(K2’K1),所以需要除以2

5.这个杰宝中的i=1,但是,i的取值可以是0,也就是说,左边至少是0个,而右边呢?是(n-2-i)个,右边也至少是0个,所以有不等式:

n-2-i >=0

得 i<=n-2

所以i的取值是 [0,n-2]

对应i的每个取值,得到的新顶点数为:

Vnew = i(n-2-i)/4

新线段数为:

Enew = (i(n-2-i)+1)/2

5.第四条写的是产线的“新线段“和“新顶点”的数目,而对应椭圆上的n个顶点,都需要遍历0到n-2的次数,然后加上本边界上的顶点数n和边数n,所以总顶点数和总边数就如第一个杰宝里的求和公式了

6.分析完毕

7.Talk is cheap ,show me the code(actually the algorithm partilcally matters lin this case )

# coding=utf-8

"多少块土地"

n = input("")

eSum = 0
vSum = 0
fSum = 0
for i in range(0,n-2+1,1):
eSum += i*(n-2-i) + 1
vSum += i*(n-2-i)
eSum = n + (n*eSum)/2
vSum = n + (n*vSum)/4
fSum = eSum - vSum + 1

# print eSum
# print vSum
print fSum
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  python 算法