本文持续更新 Update date: 2021/10/1
什么是遍历?
遍历(enumerate),顾名思义,找出问题的可能解,然后一个一个地尝试。
什么时候用遍历?
简单而言,任何时候。借用老师的话:
- It should be your first idea!(拿道题,没思路,就枚举)
- It could need optimization!(过不了,找问题,再优化)
- It would be your last solution !(回头看,枚举是最“差”的算法,但是也是解决问题最基本的方法)
典型例题
立方质数
题目 如果一个质数能被表示为三个不同的质数的和的形式,那么我们称它为立方质数。现在给你一个数n,判断它是不是立方质数。
输入数据:正整数n,n<=1000
输出数据:Yes或者No
样例输入
19
样例输出
Yes
思路 新建list,标记从1到n中,所有的质数。复杂度:
O
(
n
2
)
\mathcal{O(n^2)}
O(n2) 新建list时或许用memset函数,把数组置为0;也可以逐个遍历:
# include <cstring>
memset(void *str, int c, size_t n)
具体代码如下:
int prime[1001];
memset(prime,0,1001)
for (int i = 0;i<1001;i++) {
prime[i]=1;
}
遍历2到i,是否能整除;如果发现能的,就不是质数
int n;
scanf("%d",&n);
for (int i = 1; i < 1001; ++i) {
for (int j = 2; j < i; ++j) {
if (i % j == 0){
prime[i] = 0;
break;}
}
}
把找到的one-hot,整理为numeric:
list<int> a;
for (int i=1;i<=n;i++){
if (prime[i]){
a.push_back(i);
}
}
a.erase(a.begin());
三层循环筛选立方质数
for(auto num1: a){
for(auto num2:a){
for (auto num3:a) {
if ((num1+num2+num3 == n) && (num1!=num2) && (num2!= num3) && (num1 !=num3) && (prime[n]==1)){
printf("Yes");
return 0;
}
}
}
}
printf("No");
return 0;
}
总结 纯遍历的题目不难,重要的是细心、读懂题干。不要漏掉任何一个细节!!!
|