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

来源:互联网 发布:mac是哪个国家的品牌 编辑:程序博客网 时间:2024/05/01 15:03

我也不知道为什么我这一题最后写了三百多行代码==

首先处理边界的两个年份,分别判断是否包含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 Pro1int 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;}


0 0