您的位置:首页 > 其它

蓝桥杯_历届试题 日期问题

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

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

  给出一个文献上的日期,你能帮助小明判断有哪些可能的日期对其对应吗?输入格式  一个日期,格式是"AA/BB/CC"。 (0 <= A, B, C <= 9)输出格式  输出若干个不相同的日期,每个日期一行,格式是"yyyy-MM-dd"。多个日期按从早到晚排列。样例输入02/03/04样例输出2002-03-04
2004-02-03
2004-03-02数据规模和约定  峰值内存消耗(含虚拟机) < 256M
  CPU消耗 < 1000ms

  请严格按要求输出,不要画蛇添足地打印类似:“请您输入...” 的多余内容。

  注意:
  main函数需要返回0;
  只使用ANSI C/ANSI C++ 标准;
  不要调用依赖于编译环境或操作系统的特殊函数。
  所有依赖的函数必须明确地在源文件中 #include <xxx>
  不能通过工程设置而省略常用头文件。

  提交程序时,注意选择所期望的语言类型和编译器类型。

这个题的细节处理比较多一些,并且题目中还有很多重复的地方,所以程序就显得很长很臃肿.......#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstring>
#include <map>
#include <queue>
#include <cmath>
#include <math.h>
#define INF 0x3f3f3f3f
using namespace std;
typedef long long ll;
const int MOD = 1000000007;
const int MAXN = 55;
string str;
map<string,int> M;
int x1[15] = {0,31,28,31,30,31,30,31,31,30,31,30,31};
struct time
{
int yy;
int mm;
int dd;
time(int y,int m,int d)
{
yy= y;mm = m;dd = d;
}
const operator <(const time a)const
{
if(yy > a.yy)
return true;
if(mm > a.mm)
return true;
if(dd > a.dd)
return true;
return false;
}
};
priority_queue<time> q;
bool Run_year(int year)
{
if(year%400 == 0 || (year%100 != 0 && year % 4 == 0))
return true;
return false;
}
bool Judge(string a,string b,string c)
{
int yy = (a[0]-'0')*10+(a[1] - '0');
if(yy >= 60)
yy += 1900;
else
yy += 2000;
int mm = (b[0]-'0')*10+(b[1] - '0');
int dd = (c[0]-'0')*10+(c[1] - '0');
if(mm<=0 || mm>= 13 || dd <=0 || dd >=32)
return false;
if(Run_year(yy) && mm == 2 && dd <= 29)
return true;
if(dd<=x1[mm])
return true;
return false;
}
void Init()
{
cin>>str;
}
void Solve()
{
int len = str.size();
string y,m,d;
y.push_back(str[0]);
y.push_back(str[1]);
m.push_back(str[3]);
m.push_back(str[4]);
d.push_back(str[6]);
d.push_back(str[7]);
int time_y =1900+(y[0]-'0')*10+(y[1]-'0');
int time_y1 = 2000+(y[0]-'0')*10+(y[1]-'0');
int time_m = (m[0]-'0')*10+(m[1] - '0');
int time_d = (d[0]-'0')*10+(d[1] - '0');
time t = time(time_y,time_m,time_d);
if(y[0]>='6')
{
if(Judge(y,m,d) && M["19"+y+"-"+m+"-"+d]==0)
{
q.push(time(time_y,time_m,time_d));M["19"+y+"-"+m+"-"+d]=1;
}
}
else
{
if(Judge(y,m,d) && M["20"+y+"-"+m+"-"+d]==0)
{
q.push(time(time_y1,time_m,time_d)),M["20"+y+"-"+m+"-"+d]=1;
}
}
if(d[0]<='5')
{
if(Judge(d,m,y) && M["20"+d+"-"+m+"-"+y]==0)
q.push(time(2000+(d[0]-'0')*10+(d[1]-'0'),(m[0]-'0')*10+(m[1] - '0'),(y[0]-'0')*10+(y[1] - '0'))),M["20"+d+"-"+m+"-"+y]=1;
if(Judge(d,y,m) && M["20"+d+"-"+y+"-"+m]==0)
q.push(time(2000+(d[0]-'0')*10+(d[1
4000
]-'0'),(y[0]-'0')*10+(y[1] - '0'),(m[0]-'0')*10+(m[1] - '0'))),M["20"+d+"-"+y+"-"+m]=1;
}
else
{
if(Judge(d,y,m) && M["19"+d+"-"+y+"-"+m]==0)
q.push(time(1900+(d[0]-'0')*10+(d[1]-'0'),(y[0]-'0')*10+(y[1] - '0'),(m[0]-'0')*10+(m[1] - '0'))),M["19"+d+"-"+y+"-"+m]=1;
if(Judge(d,m,y) && M["19"+d+"-"+m+"-"+y]==0)
q.push(time(1900+(d[0]-'0')*10+(d[1]-'0'),(m[0]-'0')*10+(m[1] - '0'),(y[0]-'0')*10+(y[1] - '0'))),M["19"+d+"-"+m+"-"+y]=1;
}
while(!q.empty())
{
time t = q.top();
q.pop();
printf("%d-%02d-%02d\n",t.yy,t.mm,t.dd);
}
}

int main()
{
Init();
Solve();
return 0;
}

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  细节 蓝桥杯