题目大意:生物节律
一些人相信有三种循环在一个人生命中从他或者她出生的那天起,这个三个周期是,身体,情绪,智力, 并且他们有23,28,和33天的时间,在每一个周期里面都有一个周期,在一个周期的高峰期,一个人可以在这个领域做的最好,例如,如果这是一条曲线,思维过程讲更容易清晰和集中,来自这三个不同的周期,这三个峰值在不同的时期,我们想确定每个人三个峰值同时发生的时间,对于每个周期,你要给出这年中的一个峰值(没有必要是第一个)的时间,你也需要给出一个天数这年是从那天开始的,你的任务就是在当前确定的日期找到下一个三重峰值日期,给定的日期不算,例如给定的日期是10,并且下一个三重峰值日期是2,不是3,如果三重峰值发生在给定的日期,你应该计算下一个三重峰值日期出现的时间
比较简单的模拟题,数值也不大,直接使用下标法模拟
///////////需要注意有可能开始日期在峰值前面
#include<iostream>
#include<string.h>
using namespace std;
#define maxn 31253
int day[maxn];
void MakeOne(int Start, int Tmp)
{
for(int i=Start; i<maxn; i+=Tmp)
day[i]++;
for(int i=Start-Tmp; i>=0; i-=Tmp)
day[i]++;
}
int Find(int Start, int End)
{
for(int i=Start+1; i<End; i++)
if(day[i] == 3)return i;
return End;
}
int main()
{
int x, y, z, start, k=1;
while(cin>>x>>y>>z>>start, x!=-1)
{
memset(day, 0, sizeof(day));
MakeOne(x, 23);
MakeOne(y, 28);
MakeOne(z, 33);
int ans = Find(start, start+21252);
cout<<"Case "<< k <<": the next triple peak occurs in "<< ans-start <<" days."<<endl;
k++;
}
return 0;
#include<string.h>
using namespace std;
#define maxn 31253
int day[maxn];
void MakeOne(int Start, int Tmp)
{
for(int i=Start; i<maxn; i+=Tmp)
day[i]++;
for(int i=Start-Tmp; i>=0; i-=Tmp)
day[i]++;
}
int Find(int Start, int End)
{
for(int i=Start+1; i<End; i++)
if(day[i] == 3)return i;
return End;
}
int main()
{
int x, y, z, start, k=1;
while(cin>>x>>y>>z>>start, x!=-1)
{
memset(day, 0, sizeof(day));
MakeOne(x, 23);
MakeOne(y, 28);
MakeOne(z, 33);
int ans = Find(start, start+21252);
cout<<"Case "<< k <<": the next triple peak occurs in "<< ans-start <<" days."<<endl;
k++;
}
return 0;
}