ccf csp 201312-3最大的矩形(python)

历年题解 CCF CSP历年题解(python)

在这里插入图片描述在这里插入图片描述

样例输入:

6
3 1 6 5 2 3

题目链接:201312-3最大的矩形

问题分析:

从左到右遍历每个直方图,以该直方图为高,分别向左右找高度大于等于该直方图高的直方图,位置分别记录为l,r(l为负数,r为整数)

例如遍历到第四个直方图索引为3、高为5,向左6>5再1<5停止,记录l=-1即相对于原直方图左移一位,同理得r为0,即该次遍历以(索引3,高度5)得最大面积为10=(r-l+1)*5

满分例程:

#y总的思路
n=int(input())
s=list(map(int,input().split()))
area=[]
for i in range(n):
    l,r=0,0#分别记录左右位置
    #向左遍历直方图,找到能以s[i]为高的最大矩形,矩形长为r-l+1
    for j in range(i-1,-1,-1):
        if s[j]>=s[i]:
            l-=1
        else:
            break
    for j in range(i+1,n):
        if s[j]>=s[i]:
            r+=1
        else:
            break
    area+=[s[i]*(r-l+1)]#长乘高
print(max(area))

编程量更少的思路:
遍历n个矩形,求其向右逐次扩展的面积,取最大值即为左边界为该矩形的最大矩形面积,例如第一个矩形,向右依次扩展得六个面积(3,2 ,3, 4, 5,6)

程序修改自该链接:CCF 201312-3 最大的矩形(Python100分)

链接程序虽满分,但因官网数据存在错误,未考虑矩形本身即为最大矩形的情况,例如输入
2
6 1
链接程序返回为2,实际最大矩形为6
修改过程序如下

n=int(input())
nums=list(map(int,input().split()))
total=0
for i in range(n):
    h=nums[i]
    area=nums[i]
    for j in range(i+1,n):
        if h>nums[j]:
            h=nums[j]
        area=max(area,h*(j-i+1))
    total=max(total,area)
print(total)

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值