# Date Calculation# Greedy# Conditional Logic

a468 - 12439 - February 29

🔗 前往 ZeroJudge 原題

題目描述

題目要求計算兩個日期之間(包含兩個日期本身)的閏日數量。閏年的判斷規則為:能被 4 整除但不能被 100 整除,或者能被 400 整除的年份是閏年。

解題思路

對於給定的兩個日期,分別計算出截止到每個日期的閏年數量,然後相減即可得到兩個日期之間閏日的數量。計算閏年數量時,需要考慮年份的整除規則。由於題目保證第二個日期不早於第一個日期,因此只需要計算截止到每個日期的閏年數量,然後相減即可。需要特別注意的是,如果第二個日期是 2 月 29 日,則需要將閏年數量加 1。

複雜度分析

  • 時間複雜度: O(T),其中 T 是測資數量。對於每個測資,需要進行常數次數的計算,因此時間複雜度為線性。
  • 空間複雜度: O(1),程式碼使用的額外空間是常數級別的,不隨輸入大小變化。

程式碼

#include <iostream>
using namespace std;
int t,d,y,m1,m2,d1,d2,y1,y2;
char g;
string m,b[12]={"January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"};
int main(){
	cin >> t;
	for(int ca=1;ca<=t;++ca){
		cin >> m >> d1 >> g >> y1;
		int x=0,y=0;
		for(int i=0;i<12;++i){
			if(b[i]==m){
				m1=i+1;
				break;
			}
		}
		if(m1<=2)
			--y1;
		x+=y1/4-y1/100+y1/400;
		cin >> m >> d2 >> g >> y2;
		for(int i=0;i<12;++i){
			if(b[i]==m){
				m2=i+1;
				break;
			}
		}
		if(m2<=2)
			--y2;
		y+=y2/4-y2/100+y2/400;
		if(m2==2&&d2==29)++y;
		cout << "Case " << ca << ": " << y-x << "\n";
	}
	
}

Discussion