枚举:基于逐个尝试答案的一种问题求解策略
例题一:完美立方
解题思路:
看看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;
}
例题三:称硬币