(枚舉)POJ_1006_Biorhythms

題目鏈接

大致題意

  • 人有體力、情商、智商的高峯日子,他們分別每隔23天、28天和33天出現一次。對於每個人,我們想知道何時三個高峯出現在同一天。給定三個高峯出現的日子p、e和i,再給定另一個指定的日子d,你的任務是輸出日子d之後,下一次三個高峯落在同一天的日子(用距離d的天數表示)。例如:給定日子爲10,下次出現三個高峯同一天的日子是12,則輸出2.

解題思路

  • 這裏用枚舉的方法來解決,從給定的d+1天開始,一直測試到21252天,對其中每個日期k,看是否滿足(k-p) % 23 == 0 && (k-e) % 28 == 0 && (k-i) % 33 == 0。即找出最小公倍數
  • 但是上面的方式沒有區分界限,會做許多無用功,效率低。由題意,可以先找到一個體力高峯出現的日子,很顯然最後要求的肯定是體力高峯出現的日子,所以體力高峯之間的日子可以直接不求,通過這樣快速找到體力和情商高峯同時出現的日子,然後再在體力和情商同時高峯的日子中選擇體力、情商和智商同時高峯的日子

AC代碼

#include <iostream>
#include <cstdio>
using namespace std;
int main()
{
    int p, e, i, d, caseNo = 0;
    while(cin >> p >> e >> i >> d && p != -1) {
        caseNo++;
        int k;
        for(k = d + 1; (k - p) % 23; k++);
        for(; (k - e) % 28; k += 23);
        for(; (k - i) % 33; k += 23 * 28);
        cout << "Case " << caseNo << ": the next triple peak occurs in " << k - d << " days.\n";
    }
    return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章