OpenJ_Bailian - 2977 生理周期 【枚举】
題目鏈接:https://cn.vjudge.net/problem/OpenJ_Bailian-2977
題目描述:
人生來就有三個生理周期,分別為體力、感情和智力周期,它們的周期長度為23天、28天和33天。每一個周期中有一天是高峰。在高峰這天,人會在相應的方面表現出色。例如,智力周期的高峰,人會思維敏捷,精力容易高度集中。因為三個周期的周長不同,所以通常三個周期的高峰不會落在同一天。對于每個人,我們想知道何時三個高峰落在同一天。對于每個周期,我們會給出從當前年份的第一天開始,到出現高峰的天數(不一定是第一次高峰出現的時間)。你的任務是給定一個從當年第一天開始數的天數,輸出從給定時間開始(不包括給定時間)下一次三個高峰落在同一天的時間(距給定時間的天數)。例如:給定時間為10,下次出現三個高峰同天的時間是12,則輸出2(注意這里不是3)。
Input
一行,包含四個整數:p, e, i和d,相鄰兩個整數之間用單個空格隔開。 p, e, i分別表示體力、情感和智力高峰出現的時間(時間從當年的第一天開始計算)。d 是給定的時間,可能小于p, e, 或 i。 所有給定時間是非負的并且小于等于365, 所求的時間小于等于21252。
Output
一個整數,即從給定時間起,下一次三個高峰同天的時間(距離給定時間的天數)。
Sample Input
4 5 6 7Sample Output
16994AC代碼:?
#include <iostream> #include <cmath> using namespace std; int MAX_Common_Diversor(int t1,int t2) {int c;while( t2!=0) {c = t1%t2;t1 = t2;t2 = c;}return t1; } int MIN_Common_Multiple(int t1,int t2) {return (t1*t2)/MAX_Common_Diversor(t1,t2); } int main() {int p,e,i,d;cin >> p >> e >> i >> d; /*for(int k=d+1;1;k++) {if(abs(k-p)%23==0 && abs(k-e)%28==0 && abs(k-i)%33==0) {cout << k-d;break;}} */// 優化: 很多日期是沒有必要驗證的 // 先找到體力(感情/智力)的第一次出現日期,那么從這個日期開始體力高峰期以后的出現日期必和這天差 23的整數倍 天; // 所以增量改為23,再找以23為增量的感情第一次出現的日期 , // 則以后體力和感情高峰期共同出現的日期與改天必差 最小公倍數(23,28)*整數 天; // 最后再以 最小公倍數(23,28)找三者共同出現的日期; int k;for(k=d+1;(k-p)%23;k++) ; for( ;(k-e)%28;k+=23);int Add = MIN_Common_Multiple(23,28); for( ;(k-i)%33;k+=Add);cout << k-d;return 0; } // 體力 感情 智力 // 23 28 33?
總結
以上是生活随笔為你收集整理的OpenJ_Bailian - 2977 生理周期 【枚举】的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【opencv】鱼眼图像畸变校正——透视
- 下一篇: 修改3389远程端口号