【第一周】算法之枚举

枚举:基于逐个尝试答案的一种问题求解策略
例题一:完美立方
在这里插入图片描述
解题思路:
看看N以内有多少四种组合,每个都试一遍
四重循环枚举a,b,c,d,a在最外层,d在最里层,每一层都是从小到大枚举,
a枚举范围[2,N]
b范围[2,a-1]
c范围[b,a-1]
d范围[c,a-1]
答案



#include<iostream>
#include<cstdio>
using namespace std;
int main()
{
	int N;
	scanf("%d",&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)
					{
						printf("Cube=%d,Triple=(%d,%d,%d)\n",a,b,c,d);
					}
				}
			}
		}
		
	}
	return 0;
}

例题二:生理周期
在这里插入图片描述
思路:从d+1天开始,一直试到第21252天,判断每一天是否满足要求(k-p)%23= =0&&(k-e)%28= =0&&(k-i)%33= =0
如何试的更快?
跳着试!
先找第一个体力高峰,因为两个体力高峰之间的日子不可能是3个高峰同时出现的日子,因为它绝对不是体力高峰,然后再找体力高峰和智力高峰同时出现的日子出现的日子,同样在这两个之间肯定不是三个高峰同时出现的日子,因为它绝不是 体力高峰和智力高峰同时出现的日子

#include<iostream>
#include<cstdio>
using namespace std;
#define N 21252
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<<endl;
	}
	return 0;
}

例题三:称硬币
在这里插入图片描述

发布了43 篇原创文章 · 获赞 23 · 访问量 2220

猜你喜欢

转载自blog.csdn.net/qq_44867340/article/details/104326775