zoukankan      html  css  js  c++  java
  • SRM146 DIV1 300

    数学题,分析如下:

    宽度w、高度h的矩形(包括正方形)在宽度width、高度height的矩形中所含个数是:( (width-w+1)(height-h+1) )

    因此所求不等边矩形个数:

    ( egin{equation} egin{split}  sum &= sum_{w=1}^{width} sum_{h=1}^{height} (width-w+1)(height-h+1) - sum_{w=1}^{min(width,height)}(width-w+1)(height-w+1) \ &= sum_{w=1}^{width} sum_{h=1}^{height} width*height - sum_{w=1}^{min(width,height)}(width-w+1)(height-w+1) \ &= (1+width)width/2*(1+height)height/2 - underline{sum_{w=1}^{min(width,height)}(width-w+1)(height-w+1))} end{split} end{equation} )

    注意下划线所指式子要用程序循环累加来计算

     1 class RectangularGrid:
     2     def countRectangles(self, width, height):
     3         mn = min(width, height)
     4         return int((1+width)*width/2) * int((1+height)*height/2) - countSquares(width,height)
     5 
     6 
     7 def countSquares(width, height):
     8     sum = 0
     9     k = min(width, height)
    10     for x in range(1, k+1):
    11         sum += (width-x+1) * (height-x+1)
    12     return sum
    13 
    14 
    15 # test
    16 o = RectangularGrid()
    17 
    18 # test case
    19 assert(o.countRectangles(3,3) == 22)
    20 assert(o.countRectangles(5,2) == 31)
    21 assert(o.countRectangles(10,10) == 2640)
    22 assert(o.countRectangles(1,1) == 0)
    23 assert(o.countRectangles(592,964) == 81508708664)
    View Code

    PS:好多人直接用O(width*height)的算法累加来计算的,比赛中为了编码速度,应该是可以接受的吧

  • 相关阅读:
    ural 1227 dfs判环&求最长路
    uva 11990 块状链表
    图论·二分图
    图论·双连通分量
    图论·欧拉迹
    组合博弈
    解题策略·状态精简
    组合计数·棋盘统计
    组合计数·图形统计
    组合计数·经典序列问题
  • 原文地址:https://www.cnblogs.com/valaxy/p/3393555.html
Copyright © 2011-2022 走看看