【POJ3393】Lucky and Good Months by Gregorian Calendar

这题太可怕了早已经放弃自己翻译,网上搜的题意

定义:

Goog month  该月第一个工作日为星期一的月份

Luckly month 该月最后一个工作日为星期五的月份

问: 给定一个Gregorian Calendar格里高公历的 时间闭区间(就是包括端点的年月了)

【开始年、月】~【结束年、月】

     在这个时间区间内,有多少个Goog month,有多少个Luckly month

 

文章要点:

Gregorian Calendar格里高公历 就是现在广泛使用公历(西历),下面简称GC

GC的起始日期为 111号,该日为星期六

GC平年有365天,闰年366天(2月多1天)

GC12个月,各月的天数和现在的使用的西历一致

GC1582年之前(不包括1582),若该年份能被4整除,则为闰年

GC1582年之后(包括1582),判断闰年的标准(满足下面随便一个):

(1) 能被4整除,但不能被100整除;

(2) 能被400整除。

由于历史原因,GC规定1700年无条件为闰年

由于历史原因,GC规定175293~13日共11天不存在,即17529月只有19

GC一星期有7天,排序为Sun,Mon,Tue,Wed,Thu,Fri,Sat,和现在的星期一致,其中MonFri为工作日,SunSat为休息日



#include <stdio.h>
#define N 10001
int f[N+10][15];//f[i][j]表示到第i年第j月有多少个GoodMonth
int g[N+10][15];//g[i][j]表示到第i年第j月有多少个LuckyMonth
int leap(int y)
{
    if(y==1700)
        return 1;
    if(y>=1582&&((y%4==0&&y%100!=0)||y%400==0))
        return 1;
    if(y<1582&&y%4==0)
        return 1;
    return 0;
}
int main()
{
    int cnt=0;//记录总天数
    f[0][12]=0;//记录GoodMonth的数量
    g[0][12]=0;//记录LuckyMonth的数量
    for(int i=1; i<=N; i++)
    {
        for(int j=1; j<=12; j++)
        {
            int t=cnt;
            if(j==1)//初始化当前的GoodMonth,LuckyMonth的数量与前一个月一样,假设这个月既不是LM,GM
            {
                f[i][j]=f[i-1][12];
                g[i][j]=g[i-1][12];
            }
            else
            {
                f[i][j]=f[i][j-1];
                g[i][j]=g[i][j-1];
            }
            if((cnt+5)%7==6||(cnt+5)%7==5||(cnt+5)%7==0)//这个月的前一天为周五,周六,周日
                f[i][j]++;
            if(j==1||j==3||j==5||j==7||j==8||j==10||j==12)
            {
                cnt+=31;
            }
            else if(j==4||j==6||j==9||j==11)
            {
                if(i==1752&&j==9)
                    cnt+=19;
                else cnt+=30;
            }
            else if(j==2)
            {
                if(leap(i))
                    cnt+=29;
                else cnt+=28;
            }
            if((cnt+5)%7==5||(cnt+5)%7==6||(cnt+5)%7==0)//这个月的最后一天为周日周六周五
            {
                g[i][j]++;
            }  
        }
    }
    int t,sx,sy,ex,ey;
    scanf("%d",&t);
    while(t--)
    {
        scanf("%d%d%d%d",&sx,&sy,&ex,&ey);
        if(sy==1)
        {
            sx-=1;
            sy=12;
        }
        else
        {
            sy-=1;
        }
        printf("%d %d\n",g[ex][ey]-g[sx][sy],f[ex][ey]-f[sx][sy]);
    }
}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值