Pintia最大三角形

# 2022.6.2
# 关于“最大三角形”的题解报告
# 首先题目给出了n个火柴棒,让我们找出最大周长最大的三角形
# 那就直接开始吧
# 我们先用最暴力的方法
# 我们直接暴力枚举3个点

# 2022.6.2
# 关于“最大三角形”的题解报告
# 首先题目给出了n个火柴棒,让我们找出最大周长最大的三角形
# 那就直接开始吧
# 我们先用最暴力的方法
# 我们直接暴力枚举3个点
def check(x,y,z):#用来判断是否可以组成三角形
    if x+y>z and x+z>y and y+z>x:
        return True
    return False
n=int(input())
a=list(map(int,input().split()))
# 首先特判一下n<3
if n<3:
    print('小棍的个数不能组成三角形')
else:
    #solve1()  #这是优化后的做法
    S=0
    c=[]
    for i in range(n):
        for j in range(i+1,n):
            for k in range(j+1,n):
                if check(a[i],a[j],a[k]):#判断可不可以构成三角形
                    if a[i]+a[j]+a[k]>S:#比较一下周长
                        S=a[i]+a[j]+a[k]
                        c=[a[i],a[j],a[k]]
    if S==0:#说明没有三角形
        print('没有找到能组成三角形的小棍')
    else:
        c.sort()
        print("最大三角形的周长是{}".format(S))
        print("组成最大三角形的三条边是{},{},{}".format(c[0],c[1],c[2]))

# 但是这么写我们会发现好像运行超时了,发现时间只有30ms 坑人的题目
# 于是我们要想办法优化一下算法
# 既然是求最大的,那我们是不是就可以从最大的开始找起来
# 那我们就开始改代码了
# 一下内容跟在else 后面 我们直接写一个函数
def solve1():
    a.sort()#我们从最大的开始找,找到一个就可以结束了
    for i in range(n-1,1,-1):
        for j in range(i-1,0,-1):
            for k in range(j-1,-1,-1):
                if check(a[i],a[j],a[k]):
                    print("最大三角形的周长是{}".format(a[i]+a[j]+a[k]))
                    print("组成最大三角形的三条边是{},{},{}".format(a[k],a[j],a[i]))
                    return
    print('没有找到能组成三角形的小棍')
# 我们就成功做出来这道题目了

# 我们就成功做出来这道题目了

当然,这题目还有更好的方法:

可以直接考虑连续三个数就好了,

def solve2():
    for i in range(n-1,3,-1):
        if a[i]<a[i-1]+a[i-2]:
            print("最大三角形的周长是%d"%(a[i]+a[i-1]+a[i-2]))
            print("组成最大三角形的三条边是%d,%d,%d"%(a[i-2],a[i-1],a[i]))
            return
    print('没有找到能组成三角形的小棍')

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值