• 蓝桥杯 日期问题(枚举)



    标题:日期问题

    小明正在整理一批历史文献。这些历史文献中出现了很多日期。小明知道这些日期都在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>
    不能通过工程设置而省略常用头文件。

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

     

    思路 : 枚举,一一排除不符合条件的情况即可。

      1 #include<iostream>
      2 #include<string>
      3 #include<queue>
      4 #include<set>
      5 #include<cstring>
      6 #include<cmath>
      7 #include<algorithm>
      8 #include<stdio.h>
      9 
     10 
     11 using namespace std;
     12 
     13 struct node
     14 {
     15     int year;
     16     int month;
     17     int day;
     18     
     19     bool operator <(const node& nod)
     20     {
     21         if (year < nod.year)
     22             return true;
     23         if(year > nod.year)
     24             return false;
     25 
     26         if (month < nod.month)
     27             return true;
     28         if(month > nod.month)
     29             return false;
     30 
     31         if (day < nod.day)
     32             return true;
     33         if(day > nod.day)
     34             return false;
     35     }
     36 };
     37 
     38 vector<node> v;
     39 int day[13] = {0,31,28,31,30,31,30,31,31,30,31,30,31};    //day[i]表示i月总的天数 
     40 int vis[3000][100][100] = {0};
     41 
     42 bool isRunNian(int year)    //判断是否闰年 
     43 {
     44     if(year % 400 == 0)
     45         return true;
     46     
     47     if(year % 4 == 0 && year % 100 != 0)
     48         return true;
     49     
     50     return false;
     51 }
     52 
     53 bool cmp(node a, node b)
     54 {
     55     return a < b;
     56 }
     57 
     58 
     59 int main()
     60 {
     61     int a[4];
     62     scanf("%02d/%02d/%02d", &a[1], &a[2], &a[3]);     
     63     
     64     node p;
     65     
     66     //题中说明,有采用年/月/日的,有采用月/日/年的,还有采用日/月/年的。 
     67     for(int i = 1; i <= 3; i += 2)    //所以年可能是第1个数或第3个数 
     68     {
     69         for(int j = 1; j <= 2; ++j)    //月可能是第1个数或第2个数 
     70         {
     71             for(int k = 1; k <= 3; ++k)    //日可能是第 1,2,3个数 
     72             {
     73                 if(i == j || i == k || j == k)    
     74                     continue;
     75                     
     76                 p.year = a[i];
     77                 p.month = a[j];
     78                 p.day = a[k];
     79                 
     80                 if(a[j] == 0 || a[k] == 0)    //月份和日期不能为0 
     81                     continue;
     82                 
     83                 if(p.month > 12)        //月份不能大于12 
     84                     continue;
     85                     
     86                 if(a[i] <= 59)
     87                     p.year += 2000;  
     88                 else
     89                     p.year += 1900;
     90         
     91                 if(isRunNian(p.year))    //如果是闰年 
     92                     day[2] = 29;
     93                 else
     94                     day[2] = 28;
     95                                 
     96                 if(p.day > day[p.month])    //该月的天数要符合条件 
     97                     continue;
     98                 
     99                 if(!vis[p.year][p.month][p.day])    //避免存储重复的 
    100                 {
    101                     vis[p.year][p.month][p.day] = 1;
    102                     v.push_back(p);
    103                 }
    104                 
    105                 
    106             }
    107         }
    108     }
    109     
    110     sort(v.begin(),v.end(), cmp);
    111     
    112     
    113     for(int i = 0; i < v.size(); ++i)
    114     {
    115         printf("%d-%02d-%02d
    ", v[i].year, v[i].month, v[i].day);
    116     }
    117     
    118 
    119     return 0;
    120 }
  • 相关阅读:
    struts1——静态ActionForm与动态ActionForm
    【入门篇】ANDROID开发之BUG专讲
    oracle undo 复杂度--oracle核心技术读书笔记四
    linux高级技巧:rsync同步(二)
    【c语言】数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字
    一维动态数组和二维动态数组的创建和使用
    HDU 1788 Chinese remainder theorem again 中国剩余定理
    直接选择排序
    使用enca进行字符集转码
    拒绝switch,程序加速之函数指针数组
  • 原文地址:https://www.cnblogs.com/FengZeng666/p/10543393.html
Copyright © 2020-2023  润新知