2018年四川省省赛 E-Ever17

此题得到的经验:判断数据是否合法(可用)最好写成函数,减少不停的主函数写if else减少出错率,也避免把自己写晕。

比如这道题把判断闰年写成一个函数,然后把判断是否可以算日期差写成函数,不需要又把另外一类日期判断重写。其他情况都是直接输出合法的一种日期。

教训:认真读题,01/01/01是相同的日期直接输出就行(这个地方4个小时都没发现,赛后想哭)

#include<bits/stdc++.h>
using namespace std;
const int maxn=150;
int yue[15]={0,31,28,31,30,31,30,31,31,30,31,30,31};
int check(int p)
{
     if(p%400==0||(p%100!=0&&p%4==0))
        return 366;
     return 365;
}
int pan(int a,int b,int c)
{
    if(b>0&&b<=12&&c>0&&(((b==1||b==3||b==5||b==8||b==7||b==10||b==12)&&c<=31)||((b==4||b==6||b==9||b==11)&&c<31)||(check(a+2000)==366&&b==2&&c<30)||c<29))
        return 1;
    return 0;
}
int main()
{
    int T,a,b,c;
    //ios::sync_with_stdio(false);
    string s[15]={"","January","February","March", "April", "May", "June", "July", "August", "September", "October", "November" , "December"};
    scanf("%d",&T);
    while(T--)
    {
       scanf("%d/%d/%d",&a,&b,&c);
      if(pan(a,b,c)+pan(c,a,b)==2)
      {
           int w1,w2;
           w1=w2=0;
           for(int i=0;i<a;i++)
           {
               int p=2000+i;
               w1+=check(p);
           }
           for(int i=1;i<b;i++)
            w1+=yue[i];
            w1+=c;
           if(check(a+2000)==366&&b>2)
            w1++;
           for(int i=0;i<c;i++)
           {
               int p=2000+i;
               w2+=check(p);
           }
             for(int i=1;i<a;i++)
            w2+=yue[i];
            w2+=b;
           if(check(c+2000)==366&&a>2)
            w2++;
            int ans=abs(w1-w2);
            if(ans==0)
              cout<<s[b]<<" "<<c<<", "<<2000+a<<endl;
            else
               cout<<ans<<endl;
       }
       else
       {
          if(pan(a,b,c))
             cout<<s[b]<<" "<<c<<", "<<2000+a<<endl;
           else
             cout<<s[a]<<" "<<b<<", "<<2000+c<<endl;
       }

    }

    return 0;
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章