人生來就有三個生理周期,分別為體力、感情和智力周期,它們的周期長度為23天、28天和33天。每一個周期中有一天是高峰。在高峰這天,人會在相應的方面表現出色。例如,智力周期的高峰,人會思維敏捷,精力容易高度集中。因為三個周期的周長不同,所以通常三個周期的高峰不會落在同一天。對於每個人,我們想知道何時三個高峰落在同一天。對於每個周期,我們會給出從當前年份的第一天開始,到出現高峰的天數(不一定是第一次高峰出現的時間)。你的任務是給定一個從當年第一天開始數的天數,輸出從給定時間開始(不包括給定時間)下一次三個高峰落在同一天的時間(距給定時間的天數)。例如:給定時間為10,下次出現三個高峰同天的時間是12,則輸出2(注意這裡不是3)。輸入有多組數據,以一行-1結束。
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
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,再搜,搜到三個高峰在一起就輸出,交上去之後發現TLE了……果斷換思路。
好吧,其實思路也沒有換,只是減少了一些不可能的枚舉而已,由題意可知,首先能被23整除的數先算出來,然後在被23整除的基礎上,即每次加23,能被28整除的數算出來,然後在被23和28都能整除的基礎上,即每次加23*28,能被33整除的數算出來,這樣得到的數減去開始的天數即為答案。
1 var p,e,i,d,x,k:longint; 2 begin 3 while k=k do 4 begin 5 inc(k); 6 readln(p,e,i,d); 7 if (p=-1)and(e=-1)and(i=-1)and(d=-1) then 8 break; 9 for x:=d+1 to 21252 do 10 if abs(x-p)mod 23=0 then 11 break; 12 while x<=21252 do 13 begin 14 if abs(x-e) mod 28=0 then//注意:先判斷,再加,有極限數據,下面同理 15 break; 16 inc(x,23); 17 end; 18 while x<=21252 do 19 begin 20 if abs(x-i) mod 33=0 then 21 break; 22 inc(x,23*28); 23 end; 24 writeln('Case ',k,': the next triple peak occurs in ',x-d,' days.'); 25 end; 26 end.