HDU6010 DayLight Saving Light(模拟)

传送门:DayLight Saving Light

夏令时:

  夏时令(Daylight Saving Time:DST),又称“日光节约时制”和“夏令时间”,是一种为节约能源而人为规定地方时间的制度,在这一制度实行期间所采用的统一时间称为“夏令时间”。一般在天亮早的夏季人为将时间调快一小时,可以使人早起早睡,减少照明量,以充分利用光照资源,从而节约照明用电。

摘自百度百科。

题意:

  规定每到每年三月的第二个星期日的2:00就把时间调为3:00,再到该年的2:00的时候把时间再调为1:00。所以题目的意思为每年的1月1日0:00到三月第二个星期日的2:00为“PST”(不包括这个2:00时刻),这个2:00-3:00为“Neither”,3:00这个时刻到该年11月第一个星期日的1:00时刻(不包括1:00时刻)为“PDT”,1:00时刻到年终为“Both”。具体如下:

  另一个难点在于如何确定给出的日期是不是这两个日期中的一个。这个是队友按着日历数出来的,办法笨点能出题啊就行。

  

  所以规律就出来了,当该年是平年的时候日期是由上一个减一得出来的,如果是闰年就是由上一年减二得出来的。但十一月份最小是1再减就是从7开始往下减了。观察发现三月份和十一月份的日子是成对出现的,所以求出了十一月份的来三月份的就出来了。

代码:

#include <bits/stdc++.h>
using namespace std;
const int maxn = 1e5+10;
typedef long long ll;
struct Year
{
    int ma;
    int no;
} y[100];

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

int fun(int x)
{
    if(x == 4)
        return 11;
    else if(x == 2)
        return 9;
    else if(x == 1)
        return 8;
    else if(x == 7)
        return 14;
    else if(x == 6)
        return 13;
    else if(x == 3)
        return 10;
    else if(x == 5)
        return 12;
}


void init()
{
    int n = 4;
    y[0].ma = 11,y[0].no = 4;
    for(int i = 2008; i<=2100; i++)
    {
        if(judge(i))
        {
            y[i-2007].no = (n - 2 + 7) % 7;
            n = y[i-2007].no;
        }
        else
        {
            y[i-2007].no = (n - 1 + 7) % 7;
            n = y[i-2007].no;
        }
        if(n == 0)
            y[i-2007].no = n = 7;
        y[i-2007].ma = fun(n);
    }
    return;
}

int main()
{
    init();
    int T,cnt = 1;
    scanf("%d",&T);
    while(T--)
    {
        int yy,m,dd,hh,mm,ss;
        scanf("%d-%d-%d %d:%d:%d",&yy,&m,&dd,&hh,&mm,&ss);
        printf("Case #%d: ",cnt++);
        yy = yy-2007;
        if(m == 3)
        {
            if(dd == y[yy].ma)
            {
                if(hh < 2)
                    printf("PST\n");
                else if(hh == 2)
                    printf("Neither\n");
                else
                    printf("PDT\n");
            }
            else if(dd>y[yy].ma)
                printf("PDT\n");
            else if(dd<y[yy].ma)
                printf("PST\n");

        }
        else if(m>=4 && m<=10)
            printf("PDT\n");
        else if(m==11)
        {
            if(dd == y[yy].no)
            {
                if(hh<1)
                    printf("PDT\n");
                else if(hh==1)
                    printf("Both\n");
                else
                    printf("PST\n");
            }
            else if(dd>y[yy].no)
                printf("PST\n");
            else if(dd<y[yy].no)
                printf("PDT\n");
        }
        else
            printf("PST\n");
    }
    return 0;
}
/*
样例输入:
4
2016-03-13 01:59:59
2016-03-13 02:00:00
2016-11-06 00:59:59
2016-11-06 01:00:00
样例输出:
Case #1: PST
Case #2: Neither
Case #3: PDT
Case #4: Both
*/
View Code
原文地址:https://www.cnblogs.com/sykline/p/9735433.html