1. 程式人生 > >Bailian2977 生理週期【列舉+中國剩餘定理】

Bailian2977 生理週期【列舉+中國剩餘定理】

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;
}