蓝桥杯历届试题 日期问题 (日期处理)

历届试题 日期问题

小明正在整理一批历史文献。这些历史文献中出现了很多日期。小明知道这些日期都在1960年1月1日至2059年12月31日。令小明头疼的是,这些日期采用的格式非常不统一,有采用年/月/日的,有采用月/日/年的,还有采用日/月/年的。更加麻烦的是,年份也都省略了前两位,使得文献上的一个日期,存在很多可能的日期与其对应。

比如02/03/04,可能是2002年03月04日、2004年02月03日或2004年03月02日。

给出一个文献上的日期,你能帮助小明判断有哪些可能的日期对其对应吗?

Input

一个日期,格式是"AA/BB/CC"。 (0 <= A, B, C <= 9)

Output

输出若干个不相同的日期,每个日期一行,格式是"yyyy-MM-dd"。多个日期按从早到晚排列。

Examples

样例输入
02/03/04
样例输出
2002-03-04
2004-02-03
2004-03-02




题意:

题解:

第八届的第一题…题看起来不难, 其实细节挺多的…一不小心就会WA
首先规范一下思路: 第一步我们把所有可能的日期(共6种)都先存一下, 第二步遍历一遍把不合格的都删除掉, 第三步我们再对日期进行排序即可

其实重点就在于第二步, 需要考虑的问题如下

  1. 年份范围
  2. 月份范围
  3. 日期范围 以及 闰年与否
  4. 去重

#include <cstdio>
#include <iostream>
#include <algorithm>
#include <cstring>
#include <vector>
using namespace std;
#define ms(x, n) memset(x,n,sizeof(x));
typedef  long long LL;
const int inf = 1<<30;
const LL maxn = 1e6+10;

struct node{
	int y,m,d;
	node(int yy, int mm, int dd){y=yy, m=mm, d=dd;}
	node(){}
};
int m[2][13] = {{0,31,28,31,30,31,30,31,31,30,31,30,31},{0,31,29,31,30,31,30,31,31,30,31,30,31}};
vector<node> D;
bool cmp(node a, node b){
	if(a.y!=b.y) return a.y < b.y;
	else if(a.m!=b.m) return a.m < b.m;
	else return a.d < b.d;
}

bool isLeap(int y){	return (y%4==0&&y%100!=0) || (y%400==0);}
void solve(){
    int len = D.size();
	for(int i = 0; i < len; i++){
		if(D[i].y<1960 || D[i].y>2059)
			D.erase(D.begin()+i), len--, i--;
		else if(D[i].m>12 || D[i].m<=0)
			D.erase(D.begin()+i), len--, i--;
        else{
            int t = 0;
            if(isLeap(D[i].y)) t++;

            if(D[i].d<=0 || D[i].d>m[t][D[i].m])
                D.erase(D.begin()+i), len--, i--;
        }
	}
	//去重
	for(int i = 1; i < D.size(); i++)
		if(D[i].y==D[i-1].y && D[i].m==D[i-1].m && D[i].d==D[i-1].d)
			D.erase(D.begin()+i), len--, i--;
}
int main()
{
	int a, b, c;
	scanf("%d/%d/%d",&a,&b,&c);
	//先全部添加
	D.push_back(node(1900+a, b, c));
	D.push_back(node(1900+c, a, b));
	D.push_back(node(1900+c, b, a));
	D.push_back(node(2000+a, b, c));
	D.push_back(node(2000+c, a, b));
	D.push_back(node(2000+c, b, a));
	solve();	//筛除不符合题意的日期
	sort(D.begin(), D.end(), cmp);		//对剩下日期进行排序
	for(int i = 0; i < D.size(); i++)
		printf("%04d-%02d-%02d\n",D[i].y,D[i].m,D[i].d);

	return 0;
}

猜你喜欢

转载自blog.csdn.net/a1097304791/article/details/88542751