SRM146 DIV1 300

数学题,分析如下:

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

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

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

posted @ 2013-10-29 04:26  valaxy  阅读(198)  评论(0编辑  收藏  举报