POJ:1006 Biorhythms 周期相遇 两个思路程序

Description

Some people believe that there are three cycles in a person's life that start the day he or she is born. These three cycles are the physical, emotional, and intellectual cycles, and they have periods of lengths 23, 28, and 33 days, respectively. There is one peak in each period of a cycle. At the peak of a cycle, a person performs at his or her best in the corresponding field (physical, emotional or mental). For example, if it is the mental curve, thought processes will be sharper and concentration will be easier.
Since the three cycles have different periods, the peaks of the three cycles generally occur at different times. We would like to determine when a triple peak occurs (the peaks of all three cycles occur in the same day) for any person. For each cycle, you will be given the number of days from the beginning of the current year at which one of its peaks (not necessarily the first) occurs. You will also be given a date expressed as the number of days from the beginning of the current year. You task is to determine the number of days from the given date to the next triple peak. The given date is not counted. For example, if the given date is 10 and the next triple peak occurs on day 12, the answer is 2, not 3. If a triple peak occurs on the given date, you should give the number of days to the next occurrence of a triple peak.

Input

You will be given a number of cases. The input for each case consists of one line of four integers p, e, i, and d. The values p, e, and i are the number of days from the beginning of the current year at which the physical, emotional, and intellectual cycles peak, respectively. The value d is the given date and may be smaller than any of p, e, or i. All values are non-negative and at most 365, and you may assume that a triple peak will occur within 21252 days of the given date. The end of input is indicated by a line in which p = e = i = d = -1.

Output

For each test case, print the case number followed by a message indicating the number of days to the next triple peak, in the form:

Case 1: the next triple peak occurs in 1234 days.

Use the plural form ``days'' even if the answer is 1.

Sample Input

0 0 0 0
0 0 0 100
5 20 34 325
4 5 6 7
283 102 23 320
203 301 203 40
-1 -1 -1 -1

Sample Output

Case 1: the next triple peak occurs in 21252 days.
Case 2: the next triple peak occurs in 21152 days.
Case 3: the next triple peak occurs in 19575 days.
Case 4: the next triple peak occurs in 16994 days.
Case 5: the next triple peak occurs in 8910 days.
Case 6: the next triple peak occurs in 10789 days.

问题的实际和我前面一篇博客的时针,分针和秒针相遇的问题一样的。

有两个解题思路:

1 先计算两个周期相遇的日子,然后验证这个日子是否和第三个周期相遇

2 把三个周期看成三个跑步者,跑到一个地点(日期)停下来,让最慢的先跑,看三者是否相遇,然后再让最慢的先跑,停下来,验证……如此循环

思路1的程序:

int runnersMeet(int p, int e, int i, int d)
{
    p %= 23, e %= 28, i %= 33;
    while ((i - e) % 28) i += 33;
    while ((i - p) % 23) i += 924;//28*33 == 924
    if (i <= d) return 21252 - (d - i);
    return i - d;  

}

第一个while循环是为了计算出i 和e相遇的日子的

更多精彩内容:http://www.bianceng.cnhttp://www.bianceng.cn/Programming/sjjg/

第二个whlle循环就是确定了i和e必定相遇的日子是i, i+924, i+924*2……然后验证这些日子是否也和p相遇

思路2程序:

int runnersMeet(int p, int e, int i, int d)
{
    p %= 23, e %= 28, i %= 33;
    while (!(p == e && e == i))
    {
        int m = min(p, min(e, i));
        if (m == p) p += 23;
        else if (m == e) e += 28;
        else i += 33;
    }
    if (p <= d) return 21252 - (d - p);//注意公式计算别搞错了
    return p - d;
}

思路2好像更简单点,更好理解点。

最后主程序,就AC啦。

void Biorhythms()
{
    int p,e,i,d, c = 0;
    while (cin>>p>>e>>i>>d && -1 != d)
    {
        c++;
        printf("Case %d: the next triple peak occurs in %d days.\n",
            c, runnersMeet(p, e, i, d));
    }
}  

int main()
{
    Biorhythms();
    return 0;
}

感觉是第一个思路的程序走的快点,但是实际运行反而是第一个程序慢,呵呵,计算的时间复杂度都是一样的,oj系统计算的运行时间估计也不完全可靠吧。

两个思路的应用情况:

1 如果一个的速度和其他两个的速度相差很大的时候,比如时针,分钟和秒针的情况,秒针走快很多,那么就肯定是第一个思路快,

2 但是如果如本题的话,三者速度相差无几,那么使用加法,不用模操作,也许就是第二个思路快的原因吧。

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索next
, number
, 思路
, cycle
, of
, given)''
, The
, occurred
given
追及相遇问题解题思路、biorhythms、相遇周期、卫星相遇周期、程序设计思路,以便于您获取更多的相关知识。

时间: 2024-10-04 00:11:59

POJ:1006 Biorhythms 周期相遇 两个思路程序的相关文章

两套思路用Photoshop给暗色人物照片精修美白柔肤效果

  两套思路用Photoshop给暗色人物照片精修美白柔肤效果,简单粗暴几分钟就可以搞定,原图也有提供,有兴趣的可以选择自己喜欢的方法试试 分类: PS调色教程 ps美白教程

Android实现换肤的两种思路分析_Android

本文分析了Android实现换肤的两种思路.分享给大家供大家参考,具体如下: 这里来了解换肤实现及不同方案的差异和使用场合. 一.从功能上划分 1) 软件内置多个皮肤,用户不能修改: 2) 官方提供皮肤下载,用户使用下载的皮肤: 3) 官方提供皮肤制作工具或方法,用户自制皮肤. 二.皮肤定义 软件皮肤包括图标.字体.布局.交互风格等,换肤就是换掉皮肤包括的部分或所有资源. 三.皮肤与APP分离 1)打包皮肤文件 默认格式是apk.例如Launcher,它的桌面皮肤格式是一个apk: 自定义的格式

mysql中提高Order by语句查询效率的两个思路分析_Mysql

因为可能需要对数据库的记录进行重新排序.在这篇文章中,笔者就谈谈提高Order By语句查询效率的两个思路,以供大家参考. 在MySQL数据库中,Order by语句的使用频率是比较高的.但是众所周知,在使用这个语句时,往往会降低数据查询的性能.因为可能需要对数据库的记录进行重新排序.在这篇文章中,笔者就谈谈提高Order By语句查询效率的两个思路,以供大家参考. 498)this.width=498;" border=0>  一.建议使用一个索引来满足Order By子句. 在条件允许

苹果澳大利亚悄然延长保修周期至两年 未公开宣布

苹果http://www.aliyun.com/zixun/aggregation/14583.html">澳大利亚悄然延长保修周期至两年    澳大利亚媒体报道,目前澳洲境内苹果产品的保修周期从一年延长至两年. 上周五,澳大利亚苹果零售店以及授权店的不少员工注意到,苹果已经 悄然修改了产品保修政策,从此前的12个月改为24个月,据悉此举是为了符合澳大利亚竞争与消费者委员会的规范. 从澳大利亚苹果官网页面详细写明了关于苹果保修的细则.如果根据澳大利亚消费者保护法的规定,消费者购买产品出现问

vbs中实现启动两个应用程序,一直等到其中一个程序结束,然后关闭另一个?_vbs

问: 嗨,脚本专家!这是我想要完成的任务:我想要用一个脚本启动两个可执行文件.第一个应用程序关闭后,我想让这个脚本关闭第二个应用程序,然后退出.如何完成上述任务? -- MK 答: 您好,MK.您知道,这是我们喜欢的那种类型的问题.为什么?因为它听起来确实很复杂很棘手.如果有人想找我们做什么事,我们就可以说"您知道,我正在尝试编写这样一个脚本:它能够启动两个应用程序,等到第一个关闭后,然后自动关闭第二个."然后他们肯定会说"噢,很抱歉.很显然,你们很忙",然后就不找

httpcontext-在IIS 7同一站点下发布两个应用程序,出现登录验证干扰!急!!!

问题描述 在IIS 7同一站点下发布两个应用程序,出现登录验证干扰!急!!! 在IIS7的default web site下新建了两个application,以A和B为例.然后在浏览器先登录A应用,再在另一个标签页登录B应用.这时返回到A应用的标签操作,会发现A应用程序退出!重新登录之后,去B应用的标签页操作,发现相同现象!简单说就是两个应用不能同时登录,登录A,B退出:登录B,A退出!是不是所有的application用的是同一个HttpContext?我用的是HttpContext.Curr

winform-求大神 如何把两个Winform程序合并显示在一个页面 其中一个只有安装包

问题描述 求大神 如何把两个Winform程序合并显示在一个页面 其中一个只有安装包 基于.Net 4.0 开发的 自己做了一个EXE程序A 现在需要把我自己做的和 已有的客户端程序B 合并显示在一个窗口里运行 现在有B的安装包:目前通过添加引用B的DLL 可以把登陆界面和A 显示在一个窗口 ,但是登录就是报错; 希望路过的大神们给指点指点 解决方案 要看报什么错,是不是缺少文件或者配置的问题.用installshield le打包.

两个android程序怎么使用一个数据库,sqlite。

问题描述 两个android程序怎么使用一个数据库,sqlite. 一个程序中的增删改查我都会用,但是两个程序怎么操作同一个数据库啊. 解决方案 可以发布ContentProviderhttp://blog.csdn.net/maylian7700/article/details/7365368 例子或者资料自己可以再详细找找看看 解决方案二: 因为两个android是夸进程的,所以要考虑用内容提供者 解决方案三: 楼上解答的正确,不过我的帖子更通俗易懂.http://blog.csdn.net

vs2010中怎么利用多线程同时运行两个c++程序?

问题描述 vs2010中怎么利用多线程同时运行两个c++程序? 需要用到多线程,小白,求大神带.vs2010中不知道支持多线程吗? 解决方案 两个程序同时运行,这个叫多进程.分别编译了,用createprocess或者shellexecute函数调用.多线程因为共享全局变量,不是简单把两个程序源代码放在一起就行的.