日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

OpenJ_Bailian 4148 生理周期

發布時間:2025/3/21 编程问答 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 OpenJ_Bailian 4148 生理周期 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

題目地址:?https://vjudge.net/problem/OpenJ_Bailian-4148

人生來就有三個生理周期,分別為體力周期、感情周期和智力周期,它們的周期長度分別為23天、28天和33天。每一個周期中有一天是高峰。在高峰這天,人會在相應的方面表現出色。例如,在智力周期的高峰,人會思維敏捷,注意力容易高度集中。因為三個周期的長度不同,所以通常三個周期的高峰不會落在同一天。對于每個人,想知道何時三個高峰落在同一天。對于每個周期,會給出從當前年份的第一天開始,到出現高峰的天數(不一定是第一次高峰出現的時間)。給定一個從當年第一天開始的天數,你的任務是輸出從給定時間開始(不包括給定時間),下一次三個高峰落在同一天的時間(距給定時間的天數)。例如:給定時間為10,下次出現三個高峰同一天的時間是12,則輸出2(注意這里不是3)。

輸入輸入包含多組數據,每一組數據由四個整數組成,數據以-1 -1 -1 -1 結束。
對于四個整數p, e, i和d,p, e, i分別表示體力、情感和智力高峰出現的時間(時間從當年的第一天開始計算)。d是給定的時間,可能小于p, e或i。所有給定時間是非負的并且小于或等于365,所求的時間小于或等于21252。輸出從給定時間起,下一次三個高峰同一天的時間(距離給定時間的天數)。

樣例輸入

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、未經優化的暴力枚舉
有2個需要注意的地方: (1)j要從d+1開始枚舉,不能從1開始枚舉。因為d有可能比下一次出現的時間大。例如輸入為 1 19 14 48時,如果只是從1開始枚舉,結果將會為-1
           (2)是結果j-d <= 21252,而不是j <= 21252
1 #include <iostream> 2 #include <queue> 3 using namespace std; 4 5 6 int main() 7 { 8 int p, e, i, d; 9 int num = 0; 10 while (1) 11 { 12 ++num; 13 cin >> p >> e >> i >> d; 14 if (p == -1 && e == -1 && i == -1 && d == -1) 15 break; 16 17 int j; 18 for (j = d+1; j-d <= 21252; ++j) //注意j要從d+1開始枚舉,且是j-d <= 21252 !! 19 { 20 if ((j - p) % 23 == 0 && (j - e) % 28 == 0 && (j - i) % 33 == 0) 21 { 22 printf("Case %d: the next triple peak occurs in %d days.\n", num, j-d); 23 break; 24 } 25 } 26 } 27 28 29 30 31 return 0; 32 }

?

2、優化后的枚舉算法:

  檢索時可以利用已經發現的高峰值來加速搜索的過程。例如,若發現第102天是體力的高峰值,那么第103,104,105,...,124天都不可能是體力、情感和智力高峰均出現的時間,因此可以直接跳到第102+23=125天。這個優化策略可以概括為:若某項高峰值的時間已經出現,則該高峰值的出現周期可以作為搜索步長。

1 #include <iostream> 2 3 using namespace std; 4 5 int main() 6 { 7 int p, e, i, d; 8 int num = 0; 9 while (1) 10 { 11 ++num; 12 cin >> p >> e >> i >> d; 13 if (p == -1 && e == -1 && i == -1 && d == -1) 14 break; 15 16 int j; 17 for (j = d + 1; (j - p) % 23; ++j); 18 for (; (j - e) % 28; j = j + 23); 19 for (; (j - i) % 33; j = j + 23 * 28); 20 printf("Case %d: the next triple peak occurs in %d days.\n", num, j-d); 21 22 } 23 24 25 return 0; 26 }

?

?

?

轉載于:https://www.cnblogs.com/FengZeng666/p/10413614.html

總結

以上是生活随笔為你收集整理的OpenJ_Bailian 4148 生理周期的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。