admin管理员组

文章数量:821318

Problem B: 英雄无敌3(2)【模拟,日期转换】

Problem B: 英雄无敌3(2)

Time Limit: 1 Sec  Memory Limit: 128 MB
Submit: 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;elsem[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");elseprintf("%d\n",solve(year,mouth,day));}return 0; }

  

转载于:.html

本文标签: Problem B 英雄无敌3(2)模拟,日期转换