POJ1006.Biorhythms(生物节律)

【题意】
人生来就有三个生理周期,分别为:体力、感情和智力周期,周期长度分别为23天、28天和33天。
因为三个周期的周长不同,所以通常三个周期的高峰不会落在同一天。对于每个人,我们想知道何时三个高峰落在同一天。
对于每个周期,我们会给出从当前年份的第一天开始,到出现高峰的天数(不一定是第一次高峰出现的时间)。你的任务是给定一个从当年第一天开始数的天数,输出从给定时间开始(不包括给定时间)下一次三个高峰落在同一天的时间(距给定时间的天数)。
例如:给定时间为10,下次出现三个高峰同天的时间是12,则输出2(注意这里不是3)。

【思路】

周期性问题充分利用%运算。
枚举:从d+1到21252每一天取余三个周期是否都为零,若满足则是所求。但这样做耗时无疑很高,所以进行优化。要充分利用周期性质,即当找到满足某一个周期的日子后,满足三个周期的日子必然在该日期的当前日子加上对应周期倍数的日子上,利用这个性质大大优化搜索效率。

#include<stdio.h>
int main()
{
    int x,tcase,d,d1,d2,d3;
    tcase=0;
    while(scanf("%d%d%d%d",&d1,&d2,&d3,&d))
    { 
        if(d1==-1&&d2==-1&&d3==-1&&d==-1)
            break;
        for(x=d+1;x<=21252;x++)
            if((x-d1)%23==0)
                break;
        for(;x<=21252;x+=23)
            if((x-d2)%28==0)
                break;
        for(;x<=21252;x+=23*28)
            if((x-d3)%33==0)
                break;
        printf("Case %d: the next triple peak occurs in %d days.\n",++tcase,x-d);
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/u013228808/article/details/82701861