首页 > 代码库 > 百度之星初赛(A)——T5

百度之星初赛(A)——T5

今夕何夕

Problem Description

今天是2017年8月6日,农历闰六月十五。

小度独自凭栏,望着一轮圆月,发出了“今夕何夕,见此良人”的寂寞感慨。

为了排遣郁结,它决定思考一个数学问题:接下来最近的哪一年里的同一个日子,和今天的星期数一样?比如今天是8月6日,星期日。下一个也是星期日的8月6日发生在2023年。

小贴士:在公历中,能被4整除但不能被100整除,或能被400整除的年份即为闰年。

Input

第一行为T,表示输入数据组数。

每组数据包含一个日期,格式为YYYY-MM-DD。

1 ≤ T ≤ 10000

YYYY ≥ 2017

日期一定是个合法的日期

Output

对每组数据输出答案年份,题目保证答案不会超过四位数。

Sample Input
3
2017-08-06
2017-08-07
2018-01-01
Sample Output
2023
2023
2024

 ————————————————————————

2月29日需要一波特判

其他的话如果月是2月29前他就会受今年是否为闰年的影响

不然就受到明年是否是闰年的影响

技术分享
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;
int read(){
    int ans=0,f=1,c=getchar();
    while(c<0||c>9){if(c==0) f=-1; c=getchar();}
    while(c>=0&&c<=9){ans=ans*10+(c-0); c=getchar();}
    return ans*f;
}
int T,n,y,r,ans;
char s[55];
int pd(int x){
    if(x%400==0) return 1;
    if(x%4==0&&x%100!=0) return 1;
    return 0;
}
int main()
{
    T=read();
    while(T--){
        scanf("%d-%d-%d",&n,&y,&r);
        int k=0;
        if((y<=2&&r<29)||(y<=1)){
            for(int i=n+1;;i++){
                if(pd(i-1)) k+=2;
                else k++;
                if(k%7==0){ans=i;break;}
            }
        }
        else if(y>2){
            for(int i=n+1;;i++){
                if(pd(i)) k+=2;
                else k++;
                if(k%7==0){ans=i;break;}
            }
        }
        if(y==2&&r==29){
            for(int i=n+4;;i+=4){
                if(!pd(i)) k+=4;
                else k+=5;
                if(pd(i)&&k%7==0){ans=i;break;}
            }
        }
        printf("%d\n",ans);
    }
    return 0;
}
View Code

 

百度之星初赛(A)——T5