POJ - 1006 Biorhythms 周期相遇 两个思路程序
Description
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
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
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相遇的日子的
第二个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 可是假设如本题的话,三者速度相差无几。那么使用加法,不用模操作,或许就是第二个思路快的原因吧。
POJ - 1006 Biorhythms 周期相遇 两个思路程序的更多相关文章
- POJ 1006 生理周期(中国剩余定理)
POJ 1006 生理周期 分析:中国剩余定理(注意结果要大于d即可) 代码: #include<iostream> #include<cstdio> using namesp ...
- POJ.1006 Biorhythms (拓展欧几里得+中国剩余定理)
POJ.1006 Biorhythms (拓展欧几里得+中国剩余定理) 题意分析 不妨设日期为x,根据题意可以列出日期上的方程: 化简可得: 根据中国剩余定理求解即可. 代码总览 #include & ...
- POJ 1006 - Biorhythms (中国剩余定理)
B - Biorhythms Time Limit:1000MS Memory Limit:10000KB 64bit IO Format:%I64d & %I64u Subm ...
- POJ 1006 Biorhythms(中国剩余定理)
题目地址:POJ 1006 学习了下中国剩余定理.參考的该博客.博客戳这里. 中国剩余定理的求解方法: 假如说x%c1=m1,x%c2=m2,x%c3=m3.那么能够设三个数R1,R2,R3.R1为c ...
- 中国剩余定理算法详解 + POJ 1006 Biorhythms 生理周期
转载请注明出处:http://exp-blog.com/2018/06/24/pid-1054/ #include <iostream> #include <cstdio> u ...
- [POJ 1006] Biorhythms C++解题
Biorhythms Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 107569 Accepted: 33365 ...
- poj 1006:Biorhythms(水题,经典题,中国剩余定理)
Biorhythms Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 110991 Accepted: 34541 Des ...
- poj 1006 Biorhythms (中国剩余定理模板)
http://poj.org/problem?id=1006 题目大意: 人生来就有三个生理周期,分别为体力.感情和智力周期,它们的周期长度为23天.28天和33天.每一个周期中有一天是高峰.在高峰这 ...
- POJ 1006 Biorhythms (数论-中国剩余定理)
Biorhythms Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 111285 Accepted: 34638 Des ...
随机推荐
- java多线程制作计时器
基本思路: 在类中创建thread 供按钮监听器调用. 界面设计:
- Apache 2.2 到 2.4的不同
1.权限设定方式变更 2.2使用Order Deny / Allow的方式,2.4改用Require apache2.2: Order deny,allowDeny from allapache2.4 ...
- POJ 2486 Apple Tree ( 树型DP )
#include <iostream> #include <cstring> #include <deque> using namespace std; #defi ...
- C++ sizeof 操作符的用法总结
在VC中,sizeof有着许多的用法,而且很容易引起一些错误.下面根据sizeof后面的参数对sizeof的用法做个总结. A.参数为数据类型或者为一般变量: 例如sizeof(int),sizeof ...
- No persister for 编译器每行执行两次的解决方法
是前台的 js 的 datagrid 部件加了 oncheck 事件引起
- Android 应用内HttpClient 与 WebView 共享 Cookie
DefaultHttpClient httpclient=....; String toUrl="https://cap.cityu.edu.hk/studentlan/details.as ...
- html中事件处理中的this和event对象
在用js编写页面事件处理代码时,会经常涉及到this和event对象,但有时在采用不同的事件处理,尤其是在与自定义的对象关联时,这些对象的指向变的有些复杂. 本文来详细介绍下各种场景下 这些对象 真正 ...
- php利用iframe实现无刷新文件上传功能
上传原理很简单就是利用表单的打开方式为iframe的name名,这样就可以在当前页面的iframe打来了,实现文件上传,再利用js返回上传结果. form target .在 action 属性中规定 ...
- 基于visual Studio2013解决C语言竞赛题之0419误差控制
题目 解决代码及点评 /************************************************************************/ /* 19 ...
- 【开源框架EGOTableViewPullRefresh的研究】
EGOTableViewPullRefresh:点击打开链接https://github.com/enormego/EGOTableViewPullRefresh RootViewController ...