[python与CSP的姻缘]201312-3最大的矩形

题目

官网自行查看

思路

一开始思路受刚考完202303-2的影响,从两边往中间卡值想用二分,但是这个题不行,下面值的选择可能更多
当然这个题从23年的题里面学到的点就是一定要先写一个暴力循环再去优化。。。这样更直接,不然思路会乱

先找到最大值最小值后,直接进行暴力遍历,预料之内的超时,下一步就是优化的事情了

暴力的时候外层循环矩形的高,内层又两层循环去找矩形的宽,所以优化就先尝试优化去找矩形的宽的方法,即卡可以用这个高的边界

这里需要注意的就是这里要的是连续的面积,可以想到数组里面的连续位置,既然是处理数组的连续位置,那就可以尝试用类似前缀和的思想

原来需要两层循环去卡边界,如果把每一个值高于height的位置设置为1,就可以很明显找到所有可以使用的小矩形,然后就是在这里面找最大连续值。找最大连续值确定她的宽度,然而数组里存的又都是0或1,那如果当前值是1的话,加上前一个值就是我现在宽度的值啦(是0的话不累加),最后直接找数组里的最大值就能找到宽度啦
下面附上100分代码

题解

n = int(input())
trangle = list(map(int,input().split()))

r = max(trangle)
l = min(trangle)
area = 0

for height in range(r,l-1,-1):
    lst = [1 if trangle[i]>=height else 0 for i in range(n)]
    for i in range(1,n):
        if lst[i]==1:
            lst[i]+=lst[i-1]
    area = max(area,max(lst)*height)

print(area)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值