Bailian2977 生理週期【列舉+中國剩餘定理】
阿新 • • 發佈:2019-01-01
2977:生理週期
總時間限制: 1000ms 記憶體限制: 65536kB
描述
人生來就有三個生理週期,分別為體力、感情和智力週期,它們的週期長度為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
來源
East Central North America 1999, POJ 1006, 程式設計實習2007
問題連結:Bailian2977 生理週期
問題描述:(略)
問題分析
本題有兩種解法,一是採用列舉法,但是需要進行優化,以便加快計算速度;二是使用中國剩餘定理以及到擴充套件歐幾里德演算法來解決。
這裡只採用了前一種解法。
程式說明:
本題與參考連結基本上是同一題,只是資料輸入格式略有不同。
參考連結:
POJ1006 UVA756 UVALive5421 Biorhythms【中國剩餘定理】
Bailian4148 生理週期【列舉+中國剩餘定理】
題記:(略)
AC的C語言程式(優化列舉)如下:
/* Bailian2988 生理週期 */ #include <stdio.h> int main(void) { int p, e, i, d; int date; while(~scanf("%d%d%d%d", &p, &e, &i, &d)) { date = d; d++; while((d - p) % 23 != 0) d++; while((d - e) % 28 != 0 || (d - i) % 33 != 0) d += 23; printf("%d\n", d - date); } return 0; }