题目:生理周期
描述
人生来就有三个生理周期,分别为体力,感情和智力周期。它们的周期长度为23天,28天和33天。每一个周期中有一天是高峰。 在高峰这天,人会在相应的方面表现出色。例如,智力周期的高峰,人会思维敏捷,精力容易高度集中。因为三个周期的周长不同,所以通常三个周期的高峰不会落在同一天。对于每个人,我们想知道何时三个高峰落在同天。对于每个周期,我们会给出从当前年份的第一天开始,到出现高峰的天数(不定基第次高峰出现的时间)。已知在当年的第p天出现体力高峰,第e天出现感情高峰,第i天出现智力高峰,*你的任务是给定一个天数d,计算从d开始至少多少天后三个高峰落在同一天。
注意:若d=10,如果下次出现3个高峰同天的时间是12,则输出2(注意这里不是3)。
輸入
有多组测试数据,每行四个整数:p,e,i,d。其中p,e,i分别表示体力、情感、智力的高峰出现的时间(时间从当年的第1天开始计算)。 d是给定的时间,可能小于 p,e或i。当p=e=i=-1时输入结束。
輸出
从给定时间起,下一次三个高峰同天的时间(距离给定时间的天数)。
輸入範例 1
1 2 3 4 5 6 7
| 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
|
輸出範例 1
1 2 3 4 5 6
| 21252 21152 19575 16994 8910 10789
|
提示
0<=p,e,i,d<=365
思路
这本该是一道中国剩余定理的题,但是巧了那节课我不在,
自学又搞不懂,
所以选择使用暴力。
最后甚至AC了。
直接上代码。
Code
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40
| #include<bits/stdc++.h> using namespace std; const int ji=23*28*33;
int zq[4];
int main(){ freopen("cycle.in","r",stdin); freopen("cycle.out","w",stdout); int p,e,i,d; while(1){ scanf("%d%d%d%d",zq+1,zq+2,zq+3,&d); if(zq[1]==-1&&zq[2]==-1&&zq[3]==-1){ return 0; } int s=max(zq[1],max(zq[2],zq[3])); zq[1]%=23,zq[2]%=28,zq[3]%=33; if(s==0)s+=ji; if(s>d){ while(s>=d){ if(s%23==zq[1]&&s%28==zq[2]&&s%33==zq[3]){ printf("%d\n",s-d); goto a; } s-=1; } } while(s%23!=zq[1]||s%28!=zq[2]||s%33!=zq[3]||s<d){ s+=1; } printf("%d\n",s-d); a:; } fclose(stdout); fclose(stdin); return 0; }
|