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)的算法累加来计算的,比赛中为了编码速度,应该是可以接受的吧

  • 相关阅读:
    模块
    Queue(队列)
    Stack(栈)
    Vector(容器)
    位图像素的颜色
    大数处理之三(除法)
    大数处理之二(幂运算)
    浮点数(double)的优势
    大数处理之一(加法和乘法)
    Depth-First Search
  • 原文地址:https://www.cnblogs.com/valaxy/p/3393555.html
Copyright © 2011-2022 走看看