2977 生理周期(简单的枚举例子)

描述

人生来就有三个生理周期,分别为体力、感情和智力周期,它们的周期长度为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
",j-d);
21         //printf("Case %d: the next triple peak occurs in %d days.
",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
",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 << '
';    
89     }    
90     return 0;
91 }
92 */ 
原文地址:https://www.cnblogs.com/wenzhixin/p/8428684.html