-
输入年、月、日,计算该天是本年的第几天。
-
包括三个整数年(1<=Y<=3000)、月(1<=M<=12)、日(1<=D<=31)。
-
输入可能有多组测试数据,对于每一组测试数据,输出一个整数,代表Input中的年、月、日对应本年的第几天。
-
1990 9 20 2000 5 1
-
263 122
-
题目描述:
-
输入:
-
输出:
-
样例输入:
-
样例输出:
#include <iostream>
#include <stdio.h>
using namespace std;
int dayOfMonth[13][2]={
0,0,
31,31,
28,29,
31,31,
30,30,
31,31,
30,30,
31,31,
31,31,
30,30,
31,31,
30,30,
31,31
};
int buff[3001][13][32];
int isRunnian(int year){
return year % 400 == 0 ? 1 : (year % 4 == 0 && year % 100 != 0) ? 1 : 0;
}
struct Date{
int year;
int month;
int day;
void nextDay(){
day++;
if(day > dayOfMonth[month][isRunnian(year)]){
day = 1;
month++;
}
if(month > 12){
month = 1;
year++;
}
}
};
int main()
{
Date date;
date.year = 1;
date.month = 1;
date.day = 1;
int cnt = 1,tempYear=1;
while(date.year < 3001){
// cout << date.year<< " " << date.month << " " << date.day << endl;
if(date.year != tempYear){
//cout << tempYear << " " << cnt << endl;
tempYear = date.year;
cnt = 1;
}
buff[date.year][date.month][date.day] = cnt;
date.nextDay();
cnt++;
}
int y,m,d;
while(scanf("%d%d%d",&y,&m,&d)!=EOF){
printf("%d\n",buff[y][m][d]);
}
return 0;
}
做日期型的题目都有相似的策略,将每个日期对应的值,建立一棵hash树,并且没有结点重复,处理相对比较容易
下面代码就是建树过程:
while(date.year < 3001){
// cout << date.year<< " " << date.month << " " << date.day << endl;
if(date.year != tempYear){
//cout << tempYear << " " << cnt << endl;
tempYear = date.year;
cnt = 1;
}
buff[date.year][date.month][date.day] = cnt;
date.nextDay();
cnt++;
}