题目
官网自行查看
思路
一开始思路受刚考完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)