您的位置:首页 > 编程语言

编程之美2015资格赛 A.2月29日

2015-04-21 19:44 429 查看
我也不知道为什么我这一题最后写了三百多行代码==

首先处理边界的两个年份,分别判断是否包含2月29日,注意如果第一个日期和第二个日期在同一年,则要避免将同一年的2月29日计算了两次,也要注意两个日期同年但第二个日期在2月29日之前的case。

接下来处理中间的日期即可。开始我以为闰年是每隔四年一次== 后来才发现是“四年一闰,百年不闰,四百年又闰”。所以先计算中间日期%4==0的年数(不需要排除%400!=0的case)n1,再计算中间日期%100==0的年数n2,再计算再计算中间日期%400==0的年数n3,最后的答案是n1-n2+n3。

#include<iostream>
#include<stdio.h>
#include<cstdio>
#include<stdlib.h>
#include<vector>
#include<string>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<stack>
#include<queue>
#include<ctype.h>
#include<map>
#include<time.h>
#include<bitset>
#include<set>
#include<list>
using namespace std;
//BOP quali Pro1

int T;
long long ans;
class node
{
public:
int mon;
int day;
long long year;
bool ifleap;
public:
node()
{
mon=0;
day=0;
year=0;
ifleap=false;
}
node(int d,int m,long long y,bool flg)
{
day=d;
mon=m;
year=y;
ifleap=flg;
}
};
node data[2];
bool judge(long long year)
{
if(year%4==0&&year%100!=0)
{
return true;
}
else if(year%400==0)
{
return true;
}
return false;
}
int convertmonth(char str[])
{
int ret=0;
if(strcmp(str,"January")==0)
{
ret=1;
}
if(strcmp(str,"February")==0)
{
ret=2;
}
if(strcmp(str,"March")==0)
{
ret=3;
}
if(strcmp(str,"April")==0)
{
ret=4;
}
if(strcmp(str,"May")==0)
{
ret=5;
}
if(strcmp(str,"June")==0)
{
ret=6;
}
if(strcmp(str,"July")==0)
{
ret=7;
}
if(strcmp(str,"August")==0)
{
ret=8;
}
if(strcmp(str,"September")==0)
{
ret=9;
}
if(strcmp(str,"October")==0)
{
ret=10;
}
if(strcmp(str,"November")==0)
{
ret=11;
}
if(strcmp(str,"December")==0)
{
ret=12;
}
return ret;
}
bool aft(node nd)
{
if(nd.mon>2)
{
return true;
}
else if(nd.mon==2&&nd.day>=29)
{
return true;
}
return false;
}
bool bef(node nd)
{
if(nd.mon<2)
{
return true;
}
else if(nd.mon==2&&nd.day<=29)
{
return true;
}
return false;
}
void solve()
{
if(data[0].ifleap==true)
{
if(data[0].mon<2)
{
if(data[1].year==data[0].year)
{
if(aft(data[1]))
{
ans++;
}

}
else
{
ans++;
}
}
else if(data[0].mon==2&&data[0].day<=29)
{
if(data[1].year==data[0].year)
{
if(aft(data[1]))
{
ans++;
}
}
else
{
ans++;
}

}
}
//cout<<"1: "<<ans<<endl;
if(data[1].ifleap==true)
{
if(data[1].mon>2)
{
if(data[1].year!=data[0].year)
{
ans++;
}

}
else if(data[1].mon==2&&data[1].day>=29)
{
if(data[1].year!=data[0].year)
{
ans++;
}

}
}
//cout<<"2: "<<ans<<endl;
long long left=0;
long long right=0;
long long ye=data[0].year+1;
//cout<<"ye: "<<ye<<endl;
for(int i=0;i<400;i++)
{
//if(judge(ye)==true)
if(ye%4==0)
{
left=ye;
//cout<<"l: "<<ye<<endl;
break;
}
ye++;
//cout<<ye<<"jug: "<<judge(ye)<<endl;
}
ye=data[1].year-1;
for(int i=0;i<400;i++)
{
//if(judge(ye)==true)
if(ye%4==0)
{
//cout<<"r: "<<ye<<endl;
right=ye;
break;
}
ye--;
}
if(left<=right)
{
ans+=(right-left)/4+1;
}
//cout<<"3: "<<ans<<" "<<left<<" "<<right<<endl;
left=(long long)(data[0].year/100+1)*100;
if(data[1].year%100==0)
{
right=(long long)(data[1].year/100-1)*100;
}
else
{
right=(long long)(data[1].year/100)*100;
}
if(left>right) return;
ans-=(right-left)/100+1;
//cout<<"4: "<<ans<<" "<<left<<" "<<right<<endl;
for(int i=0;i<4;i++)
{
if(judge(left)==true)
{
break;
}
left+=100;
}
for(int i=0;i<4;i++)
{
if(judge(right)==true)
{
break;
}
right-=100;
}
if(left<=right)
{
ans+=(right-left)/400+1;
}
//cout<<"5: "<<ans<<" "<<left<<" "<<right<<endl;
}
bool solvesmall()
{
if(data[0].ifleap==true)
{
if(data[0].mon<2)
{
// cout<<aft(data[1])<<endl;
if(data[1].year==data[0].year)
{
if(aft(data[1]))
{
ans++;
}

}
else
{
ans++;
}
}
else if(data[0].mon==2&&data[0].day<=29)
{
if(data[1].year==data[0].year)
{
if(aft(data[1]))
{
ans++;
}
}
else
{
ans++;
}

}
}
//cout<<"1: "<<ans<<endl;
if(data[1].ifleap==true)
{
if(data[1].mon>2)
{
if(data[1].year!=data[0].year)
{
ans++;
}

}
else if(data[1].mon==2&&data[1].day>=29)
{
if(data[1].year!=data[0].year)
{
ans++;
}

}
// cout<<data[1].mon<<" "<<data[1].day<<endl;
}
//cout<<"2: "<<ans<<endl;
int left=data[0].year+1;
int right=data[1].year-1;
for(int i=left;i<=right;i++)
{
if(judge(i))
{
ans++;
}
}
}
int main()
{
//freopen("input.txt","r",stdin);
//freopen("D-small-practice.in","r",stdin);
//freopen("out1.txt","w",stdout);
scanf("%d",&T);
for(int ca=1;ca<=T;ca++)
{
char s[20];
int d;
long long y;
ans=0;
scanf("%s %d,%lld",&s,&d,&y);
data[0]=node(d,convertmonth(s),y,false);
if(judge(y))
{
data[0].ifleap=true;
}
scanf("%s %d,%lld",&s,&d,&y);
data[1]=node(d,convertmonth(s),y,false);
if(judge(y))
{
data[1].ifleap=true;
}
solve();
printf("Case #%d: %lld\n",ca,ans);
// ans=0;
// solvesmall();
//printf("Case #%d: %d\n",ca,ans);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: