鱼C论坛

 找回密码
 立即注册
查看: 2438|回复: 45

[已解决]Python:每日一题 362

[复制链接]
发表于 2020-3-29 17:50:08 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 zltzlt 于 2020-3-29 18:07 编辑

今天的题目:


给定包含多个点坐标的数组 points,从其中取三个点组成三角形,返回能组成的最大三角形的面积。

说明:
1. 3 <= len(points) <= 50
2. 不存在重复的点
3. -50 <= points[c][d] <= 50
4. 结果误差值在 10-6 以内都认为是正确答案。
5. 点的坐标都是整数。

示例:

输入:points = [[0, 0], [0, 1], [1, 0], [0, 2], [2, 0]]
输出:2
解释:这五个点如下图所示。

triangle.png

组成的橙色三角形是最大的,面积为 2。


欢迎大家一起答题!
最佳答案
2020-3-31 18:11:15

敲错啦
from itertools import combinations as cb
def f361(points):
    return max(abs((x0-x2)*(y1-y2)-(x1-x2)*(y0-y2)) for (x0,y0),(x1,y1),(x2,y2) in cb(points,3))/2

本帖被以下淘专辑推荐:

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-3-29 17:54:36 | 显示全部楼层
本帖最后由 TJBEST 于 2020-3-30 21:16 编辑

不知道对不对,有点麻烦,可能会有错误,需要楼主检验,我自己测的暂时没问题。
def fun362(points):
    def gcd(num1,num2):
        while num2:
            num1,num2 = num2,num1%num2
        return num1
    def gcd3(num1,num2,num3):
        if num1*num2 == 0:
            yue1 = num1+num2
        else:
            yue1 = gcd(num1,num2)
        if num2*num3 == 0:
            yue2 = num2+num3
        else:
            yue2 = gcd(num2,num3)
        if yue1 * yue2 == 0:
            return yue1+yue2
        else:
            return gcd(yue1,yue2)
    def getLine(point1,point2):
        A = points[point2][1] - points[point1][1]
        B = points[point1][0] - points[point2][0]
        C = points[point2][0]*points[point1][1] -points[point1][0]*points[point2][1]
        if A < 0:
            A = -A
            B = -B
            C = -C
        elif A == 0:
            if B < 0:
                B = -B
                C = -C
        yueshu = gcd3(A,abs(B),abs(C))
        return (A//yueshu,B//yueshu,C//yueshu) 
    def getH(Line,point):#代入距离方程 注意有正负号的
        return Line[0]*points[point][0]+Line[1]*points[point][1]+Line[2]
    def getX(temp,point):#找端点
        return points[temp][0] - points[point][0]
    def getDistance(point1,point2):
        return (((points[point1][0]-points[point2][0])**2)+((points[point1][1]-points[point2][1])**2))**(1/2)
    M = len(points)
    OutPoint = set()#记录外点
    InnerPoint = set()#记录内点
    DeadLine = set()#记录直线
    index_arr = [i for i in range(0,M)]
    S = 0
    while len(index_arr) > 2:
        if index_arr[0] in InnerPoint:#如果内点 则忽略
            pass
        elif index_arr[0] in OutPoint:#如果外点 则遍历其他点
            temp = index_arr[0]
            for eachPoint in index_arr[1:]:
                if eachPoint in InnerPoint:#内点不考虑
                    pass
                else:#外点 与 未知点需要计算
                    Line = getLine(temp,eachPoint)#计算两点所在直线方程
                    if Line in DeadLine:#该直线已经算过
                        pass
                    else:
                        H_arr = [getH(Line,i) for i in range(0,M)]
                        LinePoint = [i for i in range(0,M) if H_arr[i] == 0]#直线上点
                        X_arr = [getX(temp,i) for i in LinePoint]#协助查找端点
                        if max(H_arr)*min(H_arr) < 0:#内直线
                            M_Num = max(X_arr)
                            m_Num = min(X_arr)
                            Duan1 = LinePoint[X_arr.index(M_Num)]
                            Duan2 = LinePoint[X_arr.index(m_Num)]
                            InnerPoint |= (set(LinePoint) - {Duan1,Duan2})
                        else:#外直线
                            OutPoint |= set(LinePoint)
                            M_Num = max(X_arr)
                            m_Num = min(X_arr)
                            Duan1 = LinePoint[X_arr.index(M_Num)]
                            Duan2 = LinePoint[X_arr.index(m_Num)]
                        if Duan1 in InnerPoint or Duan2 in InnerPoint:
                            pass
                        else:
                            Standard = ((Line[0]**2)+(Line[1]**2))**(1/2)
                            H = max([abs(max(H_arr)),abs(min(H_arr))])/Standard
                            Distance = getDistance(Duan1,Duan2)
                            tempS = (1/2)*(H*Distance)
                            S = S if tempS <= S else tempS
                            DeadLine.add(Line)
        else:#未知的
            temp = index_arr[0]
            for eachPoint in index_arr[1:]:
                if eachPoint in InnerPoint:#内点不考虑
                    pass
                else:#外点 与 未知点需要计算
                    Line = getLine(temp,eachPoint)#计算两点所在直线方程
                    if Line in DeadLine:#该直线已经算过
                        pass
                    else:
                        H_arr = [getH(Line,i) for i in range(0,M)]
                        LinePoint = [i for i in range(0,M) if H_arr[i] == 0]#直线上点
                        X_arr = [getX(temp,i) for i in LinePoint]#协助查找端点
                        if max(H_arr)*min(H_arr) < 0:#内直线
                            M_Num = max(X_arr)
                            m_Num = min(X_arr)
                            Duan1 = LinePoint[X_arr.index(M_Num)]
                            Duan2 = LinePoint[X_arr.index(m_Num)]
                            InnerPoint |= (set(LinePoint) - {Duan1,Duan2})
                        else:#外直线
                            OutPoint |= set(LinePoint)
                            M_Num = max(X_arr)
                            m_Num = min(X_arr)
                            Duan1 = LinePoint[X_arr.index(M_Num)]
                            Duan2 = LinePoint[X_arr.index(m_Num)]
                        if Duan1 in InnerPoint or Duan2 in InnerPoint:
                            pass
                        else:
                            Standard = ((Line[0]**2)+(Line[1]**2))**(1/2)
                            H = max([abs(max(H_arr)),abs(min(H_arr))])/Standard
                            Distance = getDistance(Duan1,Duan2)
                            tempS = (1/2)*(H*Distance)
                            S = S if tempS <= S else tempS
                            DeadLine.add(Line)
                        if temp in InnerPoint:
                            break
        index_arr = index_arr[1:]
    return S

评分

参与人数 1荣誉 +5 鱼币 +5 收起 理由
zltzlt + 5 + 5

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-29 17:55:58 | 显示全部楼层
问个问题,横纵坐标都是整数吗?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-3-29 17:59:45 | 显示全部楼层
TJBEST 发表于 2020-3-29 17:55
问个问题,横纵坐标都是整数吗?

见帖子 “说明”
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-29 18:05:20 | 显示全部楼层
zltzlt 发表于 2020-3-29 17:59
见帖子 “说明”

那就是实数吧
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-3-29 18:07:39 | 显示全部楼层

是整数,刚刚漏了一条
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-29 18:08:38 | 显示全部楼层
本帖最后由 BngThea 于 2020-3-29 19:55 编辑
def fun362(lst):
    length=len(lst)
    area = 0
    for i in range(length-2):
        for j in range(i+1,length-1):
            for k in range(j+1,length):
                (x1,y1),(x2,y2),(x3,y3)=lst[i],lst[j],lst[k]
                tmp = abs((1/2)*(x1*y2+x2*y3+x3*y1-x1*y3-x2*y1-x3*y2))
                if area < tmp:
                    area = tmp
    return area

评分

参与人数 1荣誉 +5 鱼币 +5 收起 理由
zltzlt + 5 + 5

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-29 18:16:16 From FishC Mobile | 显示全部楼层
本帖最后由 kinkon 于 2020-3-29 20:05 编辑
form itertools import combinations as cb
def f361(points):
    return max(abs((x0-x2)*(y1-y2)-(x1-x2)*(y0-y2)) for (x0,y0),(x1,y1),(x2,y2) in cb(points,3))/2

评分

参与人数 1荣誉 +2 鱼币 +2 收起 理由
zltzlt + 2 + 2

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-29 18:45:23 | 显示全部楼层
from math import sqrt, pow
# S = sqrt(p(p-a)(p-b)(p-c)) when p = (a + b + c) / 2


def daily362(points: list) -> int:
    area = []
    for i in range(len(points)):
        for j in range(len(points)):
            for k in range(len(points)):
                if i != j != k:
                    a = get_Length(points[i], points[j])
                    b = get_Length(points[j], points[k])
                    c = get_Length(points[k], points[i])
                    if is_Triangle([a, b, c]):
                        area.append(get_Area([a, b, c]))
    area.sort()
    return area[-1]



def get_Length(p1: list, p2: list) -> float:
    return sqrt(pow(p2[1]-p1[1], 2) + pow(p2[0]-p1[0], 2))


def is_Triangle(l: list) -> bool:
    l.sort()
    if l[0] + l[1] > l[2]:
        return True
    return False


def get_Area(l: list) -> float:
    p = (l[0] + l[1] + l[2]) / 2
    return sqrt(p * (p-l[0])* (p-l[1])* (p-l[2]))

写个最笨的,等大佬有好的思路

评分

参与人数 1荣誉 +5 鱼币 +5 收起 理由
zltzlt + 5 + 5

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-29 19:02:12 | 显示全部楼层
from itertools import permutations as p
def f362(points):
    m=0
    for a,b,c in p(points,3):
        xa,ya=a
        xb,yb=b
        xc,yc=c
        m=max(m,(xa*(yb-yc)+xb*(yc-ya)+xc*(ya-yb))/2)
    return m

评分

参与人数 1荣誉 +5 鱼币 +5 收起 理由
zltzlt + 5 + 5

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-29 19:34:16 | 显示全部楼层
本帖最后由 mdphd 于 2020-3-29 20:50 编辑
import math
def area(A,B,C):
    a = (A[0] - B[0]) ** 2 + (A[1] - B[1]) ** 2
    b = (B[0] - C[0]) ** 2 + (B[1] - C[1]) ** 2
    c = (C[0] - A[0]) ** 2 + (C[1] - A[1]) ** 2
    s = math.sqrt(- a**2 - b**2 - c**2 + 2*a*b +2*b*c + 2*c*a) / 4
    return s
def f362(points):
    points.sort()
    keysmax = list(map(lambda x:points[x][0],range(len(points))))
    dictmax = dict(zip(keysmax,points))
    points.sort(reverse = True)
    keysmin = list(map(lambda x:points[x][0],range(len(points))))
    dictmin = dict(zip(keysmin,points))
    out = list(dictmax.values()) + list(dictmin.values())
    out = [list(t) for t in set(tuple(_) for _ in out)]
    n = len(out)
    S = []
    for i in range(0, n):
        for j in range(i,n):
            for k in range(j,n):
                S.append(area(out[i],out[j],out[k]))
    return max(S)

评分

参与人数 1荣誉 +5 鱼币 +5 收起 理由
zltzlt + 5 + 5

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-29 19:41:26 | 显示全部楼层
一行代码
from itertools import permutations as p        
def f362(points:list)->float:
    return max([(1/2)*(x[0]*y[1]+y[0]*z[1]+z[0]*x[1]-x[0]*z[1]-y[0]*x[1]-z[0]*y[1]) for x,y,z in p(points,3)])

评分

参与人数 1荣誉 +6 鱼币 +6 收起 理由
zltzlt + 6 + 6

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-29 23:15:34 | 显示全部楼层
from itertools import combinations as p
def func362(points):
    s = 0
    for a,b,c in p(points,3):
        x1,y1 = a
        x2,y2 = b
        x3,y3 = c
        s=max(s, abs((1/2)*(x1*y2+x2*y3+x3*y1-x1*y3-x2*y1-x3*y2)))
    return s

评分

参与人数 1荣誉 +5 鱼币 +5 收起 理由
zltzlt + 5 + 5

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-30 09:59:58 | 显示全部楼层
本帖最后由 旅途Z 于 2020-3-31 17:46 编辑

import numpy as np


def calc_area(array, index):
    array = np.array(array)
    a = array[index[0]]
    b = array[index[1]]
    c = array[index[2]]
    x = b - a
    y = c - a
    return abs(x[0] * y[1] - x[1] * y[0])


def get_triangle(point_array):
    length = len(point_array)
    points = combinations(range(length), 3)
    max_area = 0
    for point in points:
        area = calc_area(point_array, point)
        if area >= max_area:
            max_area = area
    return max_area/2

评分

参与人数 1荣誉 +3 鱼币 +3 收起 理由
zltzlt + 3 + 3

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-30 10:48:32 | 显示全部楼层
def cals(points):
     max=-1
     for i in points :
          for j in points :
               for k in points :
                    s = i[0]*j[1]-i[0]*k[1]+j[0]*k[1]-j[0]*i[1]+k[0]*i[1]-j[0]*j[1]
                    if(s>max):
                        max = s
     return(max//2)

评分

参与人数 1荣誉 +3 鱼币 +3 收起 理由
zltzlt + 3 + 3

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-30 11:38:32 | 显示全部楼层
学c中
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-30 13:47:22 | 显示全部楼层
def f362(points):
    import itertools
    import math
    three_points=itertools.combinations(points, 3)
    area=[]
    for i in three_points:
        a = math.sqrt((i[0][0] - i[1][0]) * (i[0][0] - i[1][0]) + (i[0][1] - i[1][1]) * (i[0][1] - i[1][1]))
        b = math.sqrt((i[0][0] - i[2][0]) * (i[0][0] - i[2][0]) + (i[0][1] - i[2][1]) * (i[0][1] - i[2][1]))
        c = math.sqrt((i[1][0] - i[2][0]) * (i[1][0] - i[2][0]) + (i[1][1] - i[2][1]) * (i[1][1] - i[2][1]))
        area.append((math.sqrt((a+b+c)*(a+b-c)*(a+c-b)*(b+c-a)))/4)
    return max(area)

评分

参与人数 1荣誉 +3 鱼币 +3 收起 理由
zltzlt + 3 + 3

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-30 14:21:14 | 显示全部楼层
楼主 今天刚开始做这题,感觉有点难。@zltzlt  我最晚晚上9点可以吗?别封题
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-30 16:42:38 | 显示全部楼层
本帖最后由 蒋博文 于 2020-3-30 16:47 编辑
def fun362(points):
    result = 0
    for i in range(len(points)):
        for j in range(i+1, len(points)):
            for z in range(j+1, len(points)):
                max_area = (points[i][0] * points[j][1] + points[j][0] * points[z][1] + 
                        points[z][0] * points[i][1] - points[i][0] * points[z][1] - 
                        points[j][0] * points[i][1] - points[z][0] * points[j][1]) / 2
                result = max(result, abs(max_area))
        return result

评分

参与人数 1荣誉 +3 鱼币 +3 收起 理由
zltzlt + 3 + 3

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-3-30 18:05:29 | 显示全部楼层
TJBEST 发表于 2020-3-30 14:21
楼主 今天刚开始做这题,感觉有点难。@zltzlt  我最晚晚上9点可以吗?别封题

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-25 18:55

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表