枚举法,打卡第一天
枚举法就是穷举使题目成立所有的解大体步骤1确定可行解的范围2枚举所有可行解3通过有用信息优化枚举范围例题1信息学奥赛一本通2040【例5.7】筛选法找质数信息学奥赛一本通C版在线评测系统#includeiostream #includecmath using namespace std; bool isprime(int v){ if(v2) return false; for(int i2;isqrt(v);i){ if(v%i0) return false; } return true; } int main(){ int n; cinn; //确定可行解的范围 for(int i2;in;i){ //筛选可行解 if(isprime(i)){ coutiendl; } } return 0; }最小的质数是2为了方便直接用一个判断解决1和0的可能用sqrtv缩减枚举范围例如24的因子有212等用v的话相当于212搜了两遍例题2找出n以内的所有合数合数除了1和本身还有其余因子相当于例题一的变式吧最小的合数是4直接上代码#includeiostream #includecmath using namespace std; bool composite(int v) { if (v 4) return false; for (int i 2; i sqrt(v); i) { if (v % i 0) return true; } return false; } int main() { int n; cin n; //确定可行解的范围 for (int i 4; i n; i) { //筛选可行解 if (composite(i)) { cout i endl; } } return 0; }例题3找出n以内的所有完数完数除了本身以外的所有因子加和等于本身#includeiostream using namespace std; int main() { int n; cin n; for (int i 2; i n; i) { int sum 0; //计算因子之和 for (int j 1; j i; j) { if (i % j 0) sum j; } if (sum i) cout i endl; } return 0; }例题4水仙花数输出所有的水仙花数水仙花数一个三位数它的每位上的数字的三次幂之和等于本身例如1531^35^33^3#includeiostream using namespace std; int main() { for (int i 100; i 999; i) { int a i % 10; //存储个位 int b i / 10 % 10; //存储十位 int c i / 100; if (a * a * a b * b * b c * c * c i) { cout i endl; } } }看了这么多数相信你有点腻了那我们换个胃口例题5洛谷P7909 [CSP-J 2021] 分糖果P7909 [CSP-J 2021] 分糖果 - 洛谷此题枚举会超时因为on最多处理10^7的数据此题r-l的最大达到10^9必定有数据TLE需要采用数学解法但不代表枚举法拿不到分枚举做法#includeiostream using namespace std; int main() { int n, l, r; cin n l r; int maxvalue 0; for (int i l; i r; i) { maxvaluemax(maxvalue,i%n); } cout maxvalue; }有一组数据TLE数学解法#includeiostream using namespace std; int main() { int n, l, r; cin n l r; if (l / n r / n) { cout r % n; } else cout n - 1; }当l与r都是n的倍数的时候获取的最多糖果数目就是r/n例如7 21 35这组数据最多的情况就是35/7-5当别的情况时n-1就是可获得的最多糖果数目最后呢讲讲个人感觉枚举法上手容易但是又很多额外的计算是遇到难题得分的底牌但是很容易超时需要结合后面的高级算法进行优化打卡第一天