本文主要是介绍北京大学郭炜-生理周期 思路细讲,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
北京大学郭炜-生理周期
人有体力、情商、智商的高峰日子,它们分别每隔 23天、28天和33天出现一次。对于每个人,我们想 知道何时三个高峰落在同一天。给定三个高峰出现 的日子p,e和i(不一定是第一次高峰出现的日子), 再给定另一个指定的日子d,你的任务是输出日子d 之后,下一次三个高峰落在同一天的日子(用距离d 的天数表示)。例如:给定日子为10,下次出现三 个高峰同一天的日子是12,则输出2。
输入
输入四个整数:p, e, i和d。 p, e, i分别表示体力、情感和智力 高峰出现的日子。d是给定的日子,可能小于p, e或 i。所有给 定日子是非负的并且小于或等于365,所求的日子小于或等于 21252。
输出
从给定日子起,下一次三个高峰同一天的日子(距离给定日子 的天数)
概括成图大概是这个样子:
输入样例
0 0 0 00 0 0 1005 20 34 3254 5 6 7283 102 23 320203 301 203 40-1 -1 -1 -1
输出样例
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.
解题思路:
题目要我们输出下一次三高峰在同一天的日子,即体力、情感、智力高峰都必须出现在同一天内。
倘若我们用最普通的做法,程序从d+1天开始,一直试到21252天,对其中每一个日期k,看看是否满足:
(k-p)%23==0 && (k-e)%28==0 && (k-i)%33==0
的话,代码将会很累赘。
应该有更好的办法:
所以,我们一旦找到第一个体力高峰后,每次都夸23天去找下一个体力高峰是不是情感高峰,在找到体力高峰和情感高峰位于同一天的那个点后,每一次夸23*28天去找下一个体力高峰和情感高峰双高点是不是智力高峰,倘若是,则是三高峰。
#include <iostream>
using namespace std;
int main(){int p,e,i,d,caseNo = 0;while (cin>>p>>e>>i>>d && p!=-1){++ caseNo;int k;//找到下一次体力的最高峰for(k=d+1;(k-p)%23;k++);//找到体力最高峰后,找情商最高峰for(;(k-2)%28;k+=23);//找到情商最高峰后,找智商最高峰for(;(k-i)%33;k+=23*28);//通过3次循环找到了三高峰,输出kcout<<"Case "<<caseNo<<": the next triple peak occurs in "<<k-d<<"day";}
}
这篇关于北京大学郭炜-生理周期 思路细讲的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!