python做题记录之正方形拼接

题目描述:
现在有一堆木棒,告诉你它们的长度,判断能否用这些木棒拼接成正方形。 注意:所有的木棒都要用上,且不能截断。 给你一个正整数list L, 如 L=[1,1,1,1], L中的每个数字代表一个木棒的长度,如果这些 木棒能够拼成一个正方形,输出Yes,否则输出No。 如L=[1,1,1,1],则输出Yes;L=[1,1,1],则输出No。 注:数据已于2014-03-11加强,之前通过的代码可能无法再次通过
示例:
输入:L = [1, 1, 1, 1]

输出:Yes

1.将所有木棒根据长度从大到小排序。
2.得到所有木棒的长度总和,判断能否构成四边形以及四边的长度。
3.再依次将木棒放到四边剩余长度最大的边。
4.循环操作第3步,直到所有木棒全部放入四边。
5.最后判断四边是否全部为0。

假设我们现在手里拿了 1 根木棒,并且只能放入剩余长度最大的边,其他边放不下这根木棍,那就只能放入剩余长度最大的边了。

如果有 n 个边都可以放,并且这 n 个边剩余长度都一样,那就随便放1个边都可以。

如果现在有 n 个边都可以放,但是 n 个边的 剩余长度都不一样,怎么办?

假设现在有木棒 a > b。 2个边 分别为 A>B。

把 a 放入 A 中,那么A就变成了 A-a。

把 a 放入 B 中,那么B就变成了 B-a

因为 A>B, 所以 A-a > B-a 。

那么 b < A-a 的可能就比 b < B-a 的可能要高,这样我们就可以把更多的木棒加入4边中。

而我们的目的就是尽可能的把所以木棒放入到4个边中。

if sum(L)%4!=0 or len(L)<4 or sum(L)==0:
    print('No')
else:
    a=sum(L)//4
    b=[a,a,a,a]
    L.sort(reverse=True)
    for i in range(len(L)):
        b[3]-=L[i]
        b.sort()
    if not min(b):#用if sum(b)==0:是错的
        print('Yes')
    else:
        print('No')

猜你喜欢

转载自blog.csdn.net/qq_53029299/article/details/114579050