南邮 OJ 1114 合法日期

合法日期

时间限制(普通/Java) :  1000 MS/ 3000 MS          运行内存限制 : 65536 KByte
总提交 : 783            测试通过 : 132 

比赛描述

知道日期的来历吗。我们通常以公元纪年,如公元2009年。这种国际通行的纪年体系以传说中耶稣基督的生年为公历元年(相当于中国西汉平帝元年)。一年包括12个月,每个月的天数不全相同。

星期的起源应该是连系著月亮的周期,因为七天大约是月亮一周的四份之一。Sunday、Monday、Tuesday、Wednesday、Thursday、Friday、Saturday依次表示星期日、星期一、星期二、星期三、星期四、星期五、星期六。

给定一个日期,判断是否合法。



输入

第一行是一个正整数:测试用例数目,最多为100。之后,每个测试用例包括:

l       1行:给三个整数y、m、d和一个字符串w

输出

对于每个测试用例:

l       输出YES或NO,y、m、d、w是否构成一个合法的日期。

 

样例输入

2
2009 5 29 Monday
2009 5 30 Saturday

样例输出

NO
YES

题目来源

“IBM南邮杯”团队赛2009



#include<iostream>
#include<string>
using namespace std;

bool isLeapYear(long year){
	if(year%400==0 || year%4==0 && year%100!=0)	
		return 1;
	else
		return 0;
}
int main(void){
	int N,year,month,day,week;
	string weekStr;
	long days;
	long i=0;
	int j=0;
	int daysOfMonth[12]={31,28,31,30,31,30,31,31,30,31,30,31};
	bool weekIsRight;
	cin>>N;
	while(N--){
		cin>>year>>month>>day>>weekStr;
		if(year<1 || month<1 || month>12 || day<1 || day>daysOfMonth[month-1]){
			if(isLeapYear(i) && month==2 && day==29){
				;								//防止闰年2月29号的情况,不加也对,说明测试数据没有这种情况
			}else{
				cout<<"NO"<<endl;
				continue;
			}
		}
		days = 0;
		j = year/400;
		days += j*146097;						//每400年闰97天。365*400+97=146097
		for(i=j*400+1;i<year;++i){				//加上年里面的天数
			days += isLeapYear(i)?366:365;
		}
		for(i=0;i<month-1;++i){
			days += daysOfMonth[i];
		}
		if(month>2 && isLeapYear(year)){		//这一年是闰月且月份大于2,加上一天
			days += 1;
		}
		days += day;							//公元1年1月1日星期一
		week = days%7;
		switch(week){
			case 0:
				weekIsRight = (weekStr=="Sunday");
				break;
			case 1:
				weekIsRight = (weekStr=="Monday");
				break;
			case 2:
				weekIsRight = (weekStr=="Tuesday");
				break;
			case 3:
				weekIsRight = (weekStr=="Wednesday");
				break;
			case 4:
				weekIsRight = (weekStr=="Thursday");
				break;
			case 5:
				weekIsRight = (weekStr=="Friday");
				break;
			case 6:
				weekIsRight = (weekStr=="Saturday");
				break;
		}
//		cout<<days<<"    week:"<<week<<endl;
		if(weekIsRight){
			cout<<"YES"<<endl;
		}else{
			cout<<"NO"<<endl;
		}
	}
	return 0;
}






你可能感兴趣的:(ACM,南邮OJ,合法日期)