HDU 6010 Daylight Saving Time【打表+结构体内重载操作符】

Source

2016 CCPC-Final


题意:夏令时或者说成夏时制,表示每年的时间变迁——

每年3月份的第2个星期天的2:00会跃变为3:00,同时标准时从PST变为PDT

每年11月份的第1个星期天的2:00会跃变为1:00,同时标准时从

现在随便给出一个2007年到2010年的一个时间点,要求判断这个时间点是PDTPST , Both or Neither


思路:很明显需要打一个每年 PST变为PDT 和 PDT变为PST 的日期表(记为StoD[] 和 DtoS[])

用递推即可,因为平年365天模7余1 故同一日期的礼拜是往后移了一位 也即日期表往前减了一天(当然要处理越界),闰年366天也一样 只是减2.     另外判断闰年:四年一闰,百年不闰,四百年再闰

由于要用结构体存储 年月日时分秒,故后面比较大小时有必要——

在结构体内重载操作符:

bool operator < (const time &b) const {}

其中返回值类型:bool;

operator < —— 表示重载<运算符;

const time &b  —— 参数内部的const是为了防止引用变量被改动,time即为结构体名

参数外部的const也有必要加上


代码如下:

#include<cstdio>
using namespace std;

int StoD[105],DtoS[105];

struct time
{
    int y,mo,d,h,mi,s;
    bool operator <(const time &b) const
    {
        if(y!=b.y) return y<b.y;
        else if(mo!=b.mo) return mo<b.mo;
        else if(d!=b.d) return d<b.d;
        else if(h!=b.h) return h<b.h;
        else if(mi!=b.mi) return mi<b.mi;
        else return s<b.s;
    }
};

int main()
{
    int n,t,T;
    StoD[7]=11;
    DtoS[7]=4;
    for(int i=8;i<=100;i++)
    {
        if(i%4 || i%100==0) //不是闰年
        {
            StoD[i]=StoD[i-1]-1;
            if(StoD[i]<=7) StoD[i]+=7;
            DtoS[i]=DtoS[i-1]-1;
            if(DtoS[i]<1) DtoS[i]+=7;
        }
        else  //是闰年
        {
            StoD[i]=StoD[i-1]-2;
            if(StoD[i]<=7) StoD[i]+=7;
            DtoS[i]=DtoS[i-1]-2;
            if(DtoS[i]<1) DtoS[i]+=7;
        }
    }

    time da;
    scanf("%d",&T);
    for(t=1;t<=T;t++)
    {
        scanf("%d-%d-%d %d:%d:%d",&da.y,&da.mo,&da.d,&da.h,&da.mi,&da.s);
        time SN={da.y,3,StoD[da.y-2000],2,0,0};
        time NP={da.y,3,StoD[da.y-2000],3,0,0};
        time PB={da.y,11,DtoS[da.y-2000],1,0,0};
        time BS={da.y,11,DtoS[da.y-2000],2,0,0};
        if(da<SN) printf("Case #%d: PST\n",t);
        else if(da<NP) printf("Case #%d: Neither\n",t);
        else if(da<PB) printf("Case #%d: PDT\n",t);
        else if(da<BS) printf("Case #%d: Both\n",t);
        else printf("Case #%d: PST\n",t);
    }
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值