编程之美资格赛-2月29日

题目链接:http://hihocoder.com/contest/msbop2015qual/problem/1


题面:

题目1 : 2月29日

时间限制: 2000ms
单点时限: 1000ms
内存限制: 256MB

描述

给定两个日期,计算这两个日期之间有多少个2月29日(包括起始日期)。

只有闰年有2月29日,满足以下一个条件的年份为闰年:

1. 年份能被4整除但不能被100整除

2. 年份能被400整除

输入

第一行为一个整数T,表示数据组数。

之后每组数据包含两行。每一行格式为"month day, year",表示一个日期。month为{"January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November" , "December"}中的一个字符串。day与year为两个数字。

数据保证给定的日期合法且第一个日期早于或等于第二个日期。

输出

对于每组数据输出一行,形如"Case #X: Y"。X为数据组数,从1开始,Y为答案。

数据范围

1 ≤ T ≤ 550

小数据:

2000 ≤ year ≤ 3000

大数据:

2000 ≤ year ≤ 2×109

样例输入
4
January 12, 2012
March 19, 2012
August 12, 2899
August 12, 2901
August 12, 2000
August 12, 2005
February 29, 2004
February 29, 2012
样例输出
Case #1: 1
Case #2: 0
Case #3: 1
Case #4: 3
解题:

    特殊处理第一年和最后一年,小数据中间枚举年份就好。大数据是根据每400年算,因为还没测大数据故不确定。


小数据代码:

#include <iostream>
#include <string>
#include <map>
using namespace std;
bool judge_year(int year)
{
	if((year%4==0&&year%100)||year%400==0)
	  return true;
	return false;
}
int main()
{
	int t,m1,m2,d1,d2,y1,y2,cnt;
	char tmp;
	string s1,s2;
	cin>>t;
	map <string,int> reflect;
	reflect["January"]=1;
	reflect["February"]=2;
	reflect["March"]=3;
	reflect["April"]=4;
	reflect["May"]=5;
	reflect["June"]=6;
	reflect["July"]=7;
	reflect["August"]=8;
	reflect["September"]=9;
	reflect["October"]=10;
	reflect["November"]=11;
	reflect["December"]=12;
	for(int i=1;i<=t;i++)
	{
		cnt=0;
		cin>>s1>>d1>>tmp>>y1;
		m1=reflect[s1];
		cin>>s2>>d2>>tmp>>y2;
		m2=reflect[s2];
		if(y1==y2)
		{
			if(judge_year(y1))
			{
				if(m1<2&&m2>2)cnt=1;
				else if(m1<2&&m2==2)
				{
					if(d2==29)cnt=1; 
				}
				else if(m1==2&&m2==2)
				{
					if(d2==29)cnt=1;
				}
				else if(m1==2&&m2>2)cnt=1;
			}
		}
		else 
		{
			if(judge_year(y1))
			{
				if(m1==1)cnt++;
				else if(m1==2&&d1<=29)cnt++;
			}
			if(judge_year(y2))
			{
				if(m2>2)cnt++;
				else if(m2==2&&d2==29)cnt++;
			}
			for(int j=y1+1;j<=y2-1;)
			{
				if(judge_year(j))
				{
					cnt++;
					j+=4;
				}
				else j++;
			}
		}
		cout<<"Case #"<<i<<": "<<cnt<<endl;
	}
	return 0;
} 

大数据代码:

#include <iostream>
#include <string>
#include <map>
using namespace std;
bool judge_year(int year)
{
	if((year%4==0&&year%100)||year%400==0)
	  return true;
	return false;
}
bool judge_special_year(int year)
{
	if(year%400==0)
	  return true;
    return false;
}
int main()
{
	int t,m1,m2,d1,d2,y1,y2,cnt;
	char tmp;
	string s1,s2;
	cin>>t;
	map <string,int> reflect;
	reflect["January"]=1;
	reflect["February"]=2;
	reflect["March"]=3;
	reflect["April"]=4;
	reflect["May"]=5;
	reflect["June"]=6;
	reflect["July"]=7;
	reflect["August"]=8;
	reflect["September"]=9;
	reflect["October"]=10;
	reflect["November"]=11;
	reflect["December"]=12;
	for(int i=1;i<=t;i++)
	{
		cnt=0;
		cin>>s1>>d1>>tmp>>y1;
		m1=reflect[s1];
		cin>>s2>>d2>>tmp>>y2;
		m2=reflect[s2];
		if(y1==y2)
		{
			if(judge_year(y1))
			{
				if(m1<2&&m2>2)cnt=1;
				else if(m1<2&&m2==2)
				{
					if(d2==29)cnt=1; 
				}
				else if(m1==2&&m2==2)
				{
					if(d2==29)cnt=1;
				}
				else if(m1==2&&m2>2)cnt=1;
			}
		}
		else 
		{
			if(judge_year(y1))
			{
				if(m1==1)cnt++;
				else if(m1==2&&d1<=29)cnt++;
			}
			if(judge_year(y2))
			{
				if(m2>2)cnt++;
				else if(m2==2&&d2==29)cnt++;
			}
			for(int j=y1+1;j<=y2-1;)
			{
				if(judge_year(j))
				{
					if(judge_special_year(j))
					{
						  cnt+=(y2-1-j)/400*97+1;
						  j+=(y2-1-j)/400*400;
						j++;
					}
					else
					{
						cnt++;
						j+=4;
					}
				}
				else j++;
			}
		}
		cout<<"Case #"<<i<<": "<<cnt<<endl;
	}
	return 0;
} 


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值