b1P2241 统计方形(数据加强版) - 洛谷 | 计算机科学教育新生态 (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 <iostream>
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去重枚举减少枚举范围
2烤鸡 - 洛谷烤鸡
这个题目真的就是循环枚举,暴力循环,这个题目用来练习递归的思想比较好
3三连击加强版三连击(升级版) - 洛谷
这里真的傻了,如果我们上来就使用九重循环的时候,第一个数字是1~9,第二个数字的范围还是1~9,如果我们刚开始写的时候把条件写到for循环里面,第二个就会取不到1,之前遇见过这样的情况的,说明自己还是练习的 太少了
如果让第二个元素和第一个元素不一样,应该把限制条件写在第二个循环的后面
45036. 二元组 - AcWing题库这个题目本质上也是减少枚举量,将两重循环变成了一重循环,大大减少了时间复杂度:这个减少枚举量的方法也通过一个元素来确定另一个元素的值