算法提高 日期计算  
时间限制:1.0s   内存限制:256.0MB
    
问题描述
  已知2011年11月11日是星期五,问YYYY年MM月DD日是星期几?注意考虑闰年的情况。尤其是逢百年不闰,逢400年闰的情况。
输入格式
  输入只有一行
  YYYY MM DD
输出格式
  输出只有一行
  W
数据规模和约定
  1599 <= YYYY <= 2999
  1 <= MM <= 12
  1 <= DD <= 31,且确保测试样例中YYYY年MM月DD日是一个合理日期
  1 <= W <= 7,分别代表周一到周日
样例输入
2011 11 11
样例输出
5
把2011,11,11当做中间值,看输入的日期距离2011,11,11有多少天,然后判断星期几。
本来以为做不对,结果第一遍就通过了。
#include <iostream>
#include <cstdio>
#include <vector>
#include <queue>
#include <cstring>
#include <algorithm>
#include <cstdlib>
#define for(i,x,n) for(int i=x;i<n;i++)
#define ll long long int
#define INF 0x3f3f3f3f
#define MOD 1000000007
#define MAX_N 50005

using namespace std;

int days[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};//平年365
int days2[13]={0,31,29,31,30,31,30,31,31,30,31,30,31};//闰年366

bool judge(int a){
    if(a%4==0&&a%100!=0||a%400==0){
        return true;
    }else{
        return false;
    }
}

int cal(int y,int m,int d,int y2,int m2,int d2){
    int day=0;
    if(y<y2){
        for(i,y,y2){
            if(judge(i)){
                day+=366;
            }else{
                day+=365;
            }
        }

        int t=0;
        if(judge(y)){
            for(i,1,m){
                t+=days2[i];
            }
            t+=d;
        }else{
            for(i,1,m){
                t+=days[i];
            }
            t+=d;
        }
        day-=t;

        if(judge(y2)){
            for(i,1,m2){
                day+=days2[i];
            }
            day+=d2;
        }else{
            for(i,1,m2){
                day+=days[i];
            }
            day+=d2;
        }
    }else if(y==y2&&m<m2){
        if(judge(y)){
            for(i,m,m2){
                day+=days2[i];
            }
            day-=d;
            day+=d2;
        }else{
            for(i,m,m2){
                day+=days[i];
            }
            day-=d;
            day+=d2;
        }
    }else if(y==y2&&m==m2&&d<d2){
        day+=(d2-d);
    }

    if(y2==2011&&m2==11&&d2==11){
        day%=7;
        if(day>4){
            return 7+(5-day);
        }else{
            return 5-day;
        }
    }else{
        day%=7;
        if(day<=2){
            return 5+day;
        }else{
            return (5+day)-7;
        }
    }
}

int main()
{
    //freopen("data.txt", "r", stdin);
    //freopen("data.out", "w", stdout);
    int y,m,d;
    scanf("%d %d %d",&y,&m,&d);
    if(y<2011||y==2011&&m<11||y==2011&&m==11&&d<11){
        int t=cal(y,m,d,2011,11,11);
        printf("%d\n",t);
    }else if(y==2011&&m==11&&d==11){
        printf("5\n");
    }else if(y>2011||y==2011&&m>11||y==2011&&m==11&&d>11){
        int t=cal(2011,11,11,y,m,d);
        printf("%d\n",t);
    }
    //fclose(stdin);
    //fclose(stdout);
    return 0;
}