HDU - 6010 - Daylight Saving Time(模拟)

版权声明:沃斯里德小浩浩啊 https://blog.csdn.net/Healer66/article/details/82917843

题目背景:

夏令时(涨知识啊)

思路:

对每年的变时制那一天打表。然后对于给出的时间进行判断。

需要注意:

3月第二个星期日的2:00开始提前一个小时,其实就是在两点时直接跳到3:00,这样2:00到3:00时不是夏令时也不是太平洋时间,但是三点整这个时间是夏令时(可以理解为是夏令时的开始,而2:00其实根本不存在,因为是直接跳到3:00的)。

11月第一个星期日的2:点开始延后一小时,其实就是在两点时直接跳到1:00,这样1:00到2:00这个(时间段其实是过了两遍),但是2:00这个时间点只属于太平洋时间(第一次到1:59时并没有经过2:00,而是直接跳到了1:00)

改变时令的日期是对着日历找到规律的。因为365%7==1,多出来一天,所以对应的第一个星期天应该减小一,当然闰年要减少2。

#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;
}

猜你喜欢

转载自blog.csdn.net/Healer66/article/details/82917843
今日推荐