枚举概念
枚举法是通过计算机速度快的特点,对问题所有可能性进行枚举,从中找到答案,需要利用循环。
例题
1,简单数字谜
题目描述
在□内填上一个合适的相同的数字,使等式“□3×6528=3□×8256”成立。
输入格式
无
输出格式
一个数字
样例输入
(无)
样例输出
4
用一个for循环就行了,提示:循环从1开始到9。
代码也很简单
#include <bits/stdc++.h>//万能头
using namespace std;
int main(){
for(int i=1;i<=9;i++){//朴实无华的for循环
if((i*10+3)*6528==(30+i)*8256){
cout<<i<<endl;
return 0;//这个嘛,最好写上
}
}
return 0;//养成好习惯
}
百钱买百鸡
题目描述
中国数学家张邱建(公元五世纪,其它资料不详)在他的《算经》中提出了著名的“百钱买百鸡”问题:
鸡翁一,值钱五,鸡母一,值钱三,鸡雏三,值钱一。
百钱买百鸡,问翁、母、雏各几何?
你的任务:输出所有可行的方案。
输入格式
无
输出格式
输出共有若干行:
每行三个整数,相互之间用1个空格隔开,依次为公鸡、母鸡、小鸡的数量。
所有方案,第一优先级按公鸡的数量从小到大排列。
样例输入
(无)样例输出
(无)
代码很简单
#include <iostream>
#include <cstdio>
using namespace std;
int main(){
for(int i=0;i<=20;i++){
for(int j=0;j<=33;j++){
for(int k=0;k<=99;k+=3){
if(i+j+k==100 && i*5+j*3+k/3==100){
cout<<i<<" "<<j<<" "<<k<<endl;
}
}
}
}
return 0;
}
枚举约数的优化
约数的分布具有规律(成对出现),可以从O(n)的复杂度优化到O(),提高了枚举的效率。
需要注意的是,完全平方数有一对完全相同的约数
例题
统计约数
题目描述
给定一个正整数n,统计它有多少个约数。
输入格式
一个正整数n(1≤n≤2,000,000,000)。
输出格式
一个整数,为n的约数的个数。
样例输入
9
样例输出
3
枚举两两组合
这种问题要判断是可以重复还是不可以重复
例题
2022数对
题目描述
如果两个数之和为 2022,则称这两个数组成了一个“2022 数对”。
现在,给定 n 个互不相同的整数,统计其中有多少对整数之和为 2022。
输入格式
第一行一个整数 n (n<10000) 。
第二行 n 个整数 ai (−10000≤ai≤10000) 。
输出格式
输出一个整数,为 2022 数对的数量,不能重复统计。
样例输入
5 1 2021 1000 1022 3
样例输出
2