# Simulation# Array# Periodic

d791 - 00756 - Biorhythms

🔗 前往 ZeroJudge 原題

題目描述

題目描述了三種生物節律(身體、情感、智能),分別有 23、28 和 33 天的週期。給定每種節律的一個高峰日,以及一個指定的日期,要求計算下一個所有三種節律同時達到高峰的日期距離指定日期的天數。

解題思路

程式碼使用一個陣列 a 來模擬每個日期三種節律高峰的數量。對於給定的每個高峰日,程式碼會以 23、28 和 33 天的週期,在陣列中標記高峰日及其前後的日期。然後,程式碼從指定的日期開始,遍歷陣列,尋找第一個所有三種節律高峰數量都為 3 的日期。找到該日期後,計算它與指定日期的差值,即為答案。

複雜度分析

  • 時間複雜度: O(N),其中 N 是陣列的大小 (21701)。程式碼需要遍歷陣列來標記高峰日和尋找三重峰。
  • 空間複雜度: O(N),程式碼使用一個大小為 21701 的陣列 a 來儲存每個日期高峰的數量。

程式碼

#include <iostream>
using namespace std;
int a[21701];
int main(){
	cin.tie(0); ios::sync_with_stdio(false);
	int p,e,iq,d,ca=0;
	while(cin >> p >> e >> iq >> d){
		if(p<0)break;
		int it=0;
		for(int i=0;i<=21700;++i)
			a[i]=0; 
		for(int i=p;i<=21700;i+=23)
			++a[i];
		for(int i=p-23;i>=0;i-=23)
			++a[i];
		for(int i=e;i<=21700;i+=28)
			++a[i];
		for(int i=e-28;i>=0;i-=28)
			++a[i];
		for(int i=iq;i<=21700;i+=33)
			++a[i];
		for(int i=iq-33;i>=0;i-=33)
			++a[i];
		for(int i=d+1;i<=21700;++i){
			if(a[i]==3){
				cout << "Case " << ++ca << ": the next triple peak occurs in " << i-d << " days.\n";
				break;
			}
		}
	}
}

Discussion