题目背景:
夏令时(涨知识啊)
思路:
对每年的变时制那一天打表。然后对于给出的时间进行判断。
需要注意:
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;
}