brute force之Circular enumeration

1P2241 统计方形(数据加强版) - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

如果在一个表格当中统计所有矩形的数量,包括正方形:

我们观察对于一个2 * 3的表格:

按行枚举:第一行:第一列增加1

                                 第二列增加2

                                 第三列增加3

                    第二行:第一列增加2

                                  第二列增加4

                                  第三列增加6

                                 很容易推测到:         

                   第一行:第一列增加1 1 * 1

                                 第二列增加2   1* 2

                                 第三列增加3   1 * 3

                    第二行:第一列增加2  2 * 1

                                  第二列增加4  2 * 2

                                  第三列增加6 2 * 3

显而易见的一个双重for循环就出来答案了;

当然了如果是再遇见此种类型的题目,我们知道公式 n * (n + 1) * m * ( m + 1 ) / 4

对于正方形呢? 我们按照这样的思路看:

按行枚举:第一行:第一列增加1

                                 第二列增加1

                                 第三列增加1

                    第二行:第一列增加1

                                  第二列增加2

                                  第三列增加2

显而易见的一个for循环就出来了,枚举行和列的时候,数字小的那个是答案

所以答案就出来了:

#include 
using namespace std;

#define int long long 

signed main(){
	
	int n,m;
	cin >> n >> m;
	int a = 0;
	int b = 0;
	for(int i = 1;i <= n;i ++) {
		for(int j = 1;j <= m;j ++){
			a += min(i,j);
			b += i * j;
		}
	}
	
	cout << a << " " << b - a << endl;
		
}

当然了,这里的主题是如果更加优美的枚举:

1减少枚举量

2切换枚举元素

3去重枚举减少枚举范围

5036. 二元组 - AcWing题库这个题目本质上也是减少枚举量,将两重循环变成了一重循环,大大减少了时间复杂度

你可能感兴趣的:(算法)