- 描述
-
人生来就有三个生理周期,分别为体力、感情和智力周期,它们的周期长度为23天、28天和33天。每一个周期中有一天是高峰。在高峰这天,人会在相应的方面表现出色。例如,智力周期的高峰,人会思维敏捷,精力容易高度集中。因为三个周期的周长不同,所以通常三个周期的高峰不会落在同一天。对于每个人,我们想知道何时三个高峰落在同一天。对于每个周期,我们会给出从当前年份的第一天开始,到出现高峰的天数(不一定是第一次高峰出现的时间)。你的任务是给定一个从当年第一天开始数的天数,输出从给定时间开始(不包括给定时间)下一次三个高峰落在同一天的时间(距给定时间的天数)。例如:给定时间为10,下次出现三个高峰同天的时间是12,则输出2(注意这里不是3)。
- 输入
- 一行,包含四个整数:p, e, i和d,相邻两个整数之间用单个空格隔开。 p, e, i分别表示体力、情感和智力高峰出现的时间(时间从当年的第一天开始计算)。d 是给定的时间,可能小于p, e, 或 i。 所有给定时间是非负的并且小于等于365, 所求的时间小于等于21252。
- 输出
- 一个整数,即从给定时间起,下一次三个高峰同天的时间(距离给定时间的天数)。
- 样例输入
-
4 5 6 7
- 样例输出
-
16994
1 /* 2 简单枚举的例子 3 题意描述:输入三个周期的新一轮开始时间,和当前的时间,计算并输出从当前时间到满足三个周期的时间的最少天数*/ 4 /*解题思路:刚开始以为求三个数的最小公倍数,其实仔细一想,三个周期的开始时间不同,采用枚举思想,找出满足三个条件 5 的那一天,再减去初始天数即可。*/ 6 /* 7 方法一(超时) 8 #include<stdio.h> 9 int main() 10 { 11 int p,e,i,d; 12 int j,t=1; 13 while(scanf("%d%d%d%d",&p,&e,&i,&d),p + e + i + d != -4) 14 { 15 for(j=d+1;j<=21252;j++) 16 { 17 if((j-p)%23==0 && (j-e)%28==0 && (j-i)%33==0) 18 break; 19 } 20 printf("%d\n",j-d); 21 //printf("Case %d: the next triple peak occurs in %d days.\n",t++,j-d); 22 } 23 return 0; 24 } 25 */ 26 /* 27 方法二 28 枚举是一种基于已有的知识进行答案猜测的一种问题求解策略。 29 需要注意的问题 30 建立简洁的数学模型 31 尽可能的减少搜索空间 32 采用合适的搜索顺序 33 此题中需要满足(j-p)%23==0 && (j-e)%28==0 && (j-i)%33==0 34 减少搜索开销的办法是当结果需要满足多个条件是,先满足一个,将条件二的搜索空间减少,进而将条件三的搜索空间也减小*/ 35 36 #include<stdio.h> 37 int main() 38 { 39 int p,e,i,d; 40 int j; 41 while(scanf("%d%d%d%d",&p,&e,&i,&d) != EOF) 42 { 43 for(j=d+1;j<=21252;j++) 44 { 45 if((j-p)%23==0) 46 break; 47 } 48 for(;j<=21252;j+=23) 49 { 50 if((j-e)%28==0) 51 break; 52 } 53 for(;j<=21252;j+=23*28)//分步乘法 54 { 55 if((j-i)%33==0) 56 break; 57 } 58 printf("%d\n",j-d); 59 } 60 return 0; 61 } 62 63 64 /*另外补充一下求n个数的最小公倍数和求n个数的最大公约数(暂无)*/ 65 /*总结一句话就是两两求lcm,最后结果就是n个数的最小公倍数 66 #include <iostream> 67 using namespace std; 68 int gcd(int a,int b) 69 { 70 if (b==0) 71 return a; 72 return gcd(b, a%b); 73 } 74 int main() 75 { 76 int t; 77 cin >> t; 78 while (t--) 79 { 80 int i,n,m,temp=0,ans=1; 81 cin >> n; 82 for (i=0; i<n; i++) 83 { 84 cin >> m; 85 temp=gcd(ans,m); 86 ans=ans/temp*m; 87 } 88 cout << ans << ‘\n‘; 89 } 90 return 0; 91 } 92 */