算法入门 - 枚举

Posted So istes immer

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了算法入门 - 枚举相关的知识,希望对你有一定的参考价值。

枚举就是逐个尝试可能的答案来求解问题

枚举的同时应尽可能去缩小枚举的范围

例题1 完美立方

形如a^3=b^3+c^3+d^3的等式被称为完美立方等式。例如12^3=6^3+8^3+10^3。编写一个程序,对任给的正整数N(N<=100),寻找所有的四组元素(a,b,c,d),使得a^3=b^3+c^3+d^3, 其中a,b,c,d大于1,小于等于N,且b<=c<=d。

分析

a枚举范围 [2, N]

b枚举范围 [2, a-1]

c枚举范围 [b, a-1]

d枚举范围 [c, a-1]

#include <iostream>

using namespace std;

int main(){
	int N;
	cin >> N;
	for (int a=2;a<=N;++a) {
		for(int b=2;b<a;++b){
			for(int c=b;c<a;++c){
				for(int d=c;d<a;++d){
					if(a*a*a == b*b*b + c*c*c + d*d*d){
						cout << "cube = " << a << ", Triple = (" << b << "," << c << "," << d << ")\\n";
					}
				}
			}
		}
	}
}

例题2 生理周期

人有体力、情商、智商的高峰日子,它们分别每隔23天、28天和33天出现一次。对于每个人,我们想知道何时三个高峰落在同一天。给定三个高峰出现的日子p,e和i(不一定是第一次高峰出现的日子),再给定另一个指定的日子d,你的任务是输出日子d之后,下一次三个高峰落在同一天的日子(用距离d的天数表示)。例如:给定日子为10,下次出现三个高峰同一天的日子是12,则输出2。

输入

输入四个整数:p, e, i和d。 p, e, i分别表示体力、情感和智力高峰出现的日子。d是给定的日子,可能小于p, e或 i。所有给
定日子是非负的并且小于或等于365,所求的日子小于或等于21252。

输出

从给定日子起,下一次三个高峰同一天的日子(距离给定日子的天数)。

#include <iostream>
#define N 21252

using namespace std;

int main(){
	int p,e,i,d,caseNo=0;
	while(cin>>p>>e>>i>>d && p!=-1){
		++caseNo;
		int k;
		for(k=d+1;(k-p)%23;++k);
		for(;(k-e)%28;k+=23);
		for(;(k-i)%33;k+=23*28);
		cout<<"case"<<caseNo<<": the next triple peak occurs in "<<k-d<<" days."<<endl; 
	}
	return 0;
}

效果

0 0 0 0
case1: the next triple peak occurs in 21252 days.
0 0 0 100
case2: the next triple peak occurs in 21152 days.
5 20 34 325
case3: the next triple peak occurs in 19575 days.
4 5 6 7
case4: the next triple peak occurs in 16994 days.
-1 -1 -1 -1

以上是关于算法入门 - 枚举的主要内容,如果未能解决你的问题,请参考以下文章

⭐算法入门⭐《二分枚举》中等02 —— LeetCode 面试题 10.09. 排序矩阵查找

算法入门 01线性枚举(简单 - 第一题)LeetCode 344

⭐算法入门⭐《线性枚举》简单09 —— LeetCode 66. 加一

⭐算法入门⭐《二分枚举》中等05 —— LeetCode 1201. 丑数 III

⭐算法入门⭐《二分枚举》简单14 —— LeetCode LCP 28. 采购方案

⭐算法入门⭐《二分枚举》简单12 —— LeetCode 374. 猜数字大小