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;
}

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