POJ1006.Biorhythms(生物节律)

3 篇文章 0 订阅
3 篇文章 0 订阅

【题意】
人生来就有三个生理周期,分别为:体力、感情和智力周期,周期长度分别为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;
}

 

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值