Problem B: 英雄无敌3(2)【模拟,日期转换】
Problem B: 英雄无敌3(2)
Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 295 Solved: 52
[Submit][Status][Web Board]
Description
英雄无敌3中的兽人觉得人类的星期制度很好,要模仿这个制度,但他们大多都很愚蠢,他们搞不明白人类的星期制度。虽然他们出了很多题目(给出日期,输出星期几),但不知道答案,作为兽人的人类朋友,你可以帮助他们吗?(为了表示方便,0代表星期天,1代表星期一,2代表星期二,3代表星期三,4代表星期四,5代表星期五,6代表星期六)
Input
第一行输入一个数t,代表题目数。
每个题目有3个正整数分别为y(0<y<=2013), m(0=<m<=20), d(0<=d<=40)分别代表年,月,日。
Output
对于每组案例,输出一个整数,代表星期几(当然由于兽人很愚蠢,他们给出的日期有可能是不存在的,对于这种情况,请输出-1)
Sample Input
1
2013 4 25
Sample Output
4
【分析】:已知年月日求星期几有专门的公式,要注意的点是闰平年的二月天数不同,月份可以用常量数组表示。
#include<cstdio> #include<cstring> #include<algorithm> #include<iostream> #include<string> #include<vector> #include<stack> #include<bitset> #include<cstdlib> #include<cmath> #include<set> #include<list> #include<deque> #include<map> #include<queue> using namespace std; typedef long long ll; const double PI = acos(-1.0); const double eps = 1e-6; const int INF = 1000000000; const int maxn = 100; int T,n,m; int year,mouth,day; int solve(int yy,int mm,int dd) { int m[13]={0,31,29,31,30,31,30,31,31,30,31,30,31}; if(mm==0||mm>12||dd==0||dd>31) { return -1; } if(!((yy%4==0&&yy%100!=0)||yy%400==0)) m[2]=28; else m[2]=29; if(dd>m[mouth]) { return -1; } if(mm<3)//在普适公式/基姆拉尔公式中有个与其他公式不同的地方:
//把一月和二月看成是上一年的十三月和十四月,例:如果是2004-1-10则换算成:2003-13-10来代入公式计算。 { yy--; mm+=12; } int c=yy/100; int y=yy%100; return (((c/4-2*c+y+y/4+13*(mm+1)/5+dd-1)%7+7)%7); } int main() { scanf("%d",&T); int ans; while(T--) { scanf("%d %d %d",&year,&mouth,&day); if(year<=0||mouth<=0||day<=0||mouth>12||day>31) printf("-1\n"); else printf("%d\n",solve(year,mouth,day)); } return 0; }