AcWing 1229. 日期问题【第八届蓝桥杯省赛C++B组,第八届蓝桥杯省赛JAVAB组】
作者:互联网
AcWing 1229. 日期问题
一、题目链接
二、题目分析
(一)算法标签
模拟 枚举
(二)解题思路
三、AC代码
解法一:
版本一:使用
sort() 和 unique() 的第三个参数
、使用
自定义函数
, 即:通过bool cmp_sort(Date& date1, Date& date2);
和bool cmp_unique(Date& date1, Date& date2);
配合sort(date, date + cnt, cmp_sort);
和unique(date, date + cnt, cmp_unique);
#include <iostream>
#include <algorithm>
using namespace std;
int cnt = 0;
struct Date
{
int y, m, d;
// bool operator<(const Date& date) const
// {
// return y == date.y ? (m == date.m ? d < date.d : m < date.m) : y < date.y;
// }
// bool operator==(const Date& date) const
// {
// return y == date.y && m == date.m && d == date.d;
// }
}date[6];
bool cmp_sort(Date& date1, Date& date2)
{
return date1.y == date2.y ? (date1.m == date2.m ? date1.d < date2.d : date1.m < date2.m) : date1.y < date2.y;
}
bool cmp_unique(Date& date1, Date& date2)
{
return date1.y == date2.y && date1.m == date2.m && date1.d == date2.d;
}
int days[] = {-1, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
void get(int y, int m, int d)
{
if (!m || m > 12) return;
if (!d) return;
if (m != 2)
{
if (d > days[m]) return;
}
else
{
int leap = (y % 400 == 0) || (y % 4 == 0 && y % 100 != 0);
if (d > 28 + leap) return;
}
if (y >= 60) y += 1900;
else y += 2000;
date[cnt ++] = {y, m, d};
}
int main()
{
int a, b, c;
scanf("%d/%d/%d", &a, &b, &c);
get(a, b, c);
get(c, b, a);
get(c, a, b);
// 排序
sort(date, date + cnt, cmp_sort);
// 去重
int n = unique(date, date + cnt, cmp_unique) - date;
for (int i = 0; i < n; i ++ )
printf("%d-%02d-%02d\n", date[i].y, date[i].m, date[i].d);
return 0;
}
版本二:不使用
sort() 和 unique() 的第三个参数
、使用
struct 运算符重载函数
, 即:通过Date结构体
的成员函数
bool operator<(const Date& date) const
和bool operator==(const Date& date) const
配合sort(date, date + cnt);
和unique(date, date + cnt)
#include <iostream>
#include <algorithm>
using namespace std;
int cnt = 0;
struct Date
{
int y, m, d;
bool operator<(const Date& date) const
{
return y == date.y ? (m == date.m ? d < date.d : m < date.m) : y < date.y;
}
bool operator==(const Date& date) const
{
return y == date.y && m == date.m && d == date.d;
}
}date[6];
// bool cmp_sort(Date& date1, Date& date2)
// {
// return date1.y == date2.y ? (date1.m == date2.m ? date1.d < date2.d : date1.m < date2.m) : date1.y < date2.y;
// }
// bool cmp_unique(Date& date1, Date& date2)
// {
// return date1.y == date2.y && date1.m == date2.m && date1.d == date2.d;
// }
int days[] = {-1, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
void get(int y, int m, int d)
{
if (!m || m > 12) return;
if (!d) return;
if (m != 2)
{
if (d > days[m]) return;
}
else
{
int leap = (y % 400 == 0) || (y % 4 == 0 && y % 100 != 0);
if (d > 28 + leap) return;
}
if (y >= 60) y += 1900;
else y += 2000;
date[cnt ++] = {y, m, d};
}
int main()
{
int a, b, c;
scanf("%d/%d/%d", &a, &b, &c);
get(a, b, c);
get(c, b, a);
get(c, a, b);
// 排序
sort(date, date + cnt);
// 去重
int n = unique(date, date + cnt) - date;
for (int i = 0; i < n; i ++ )
printf("%d-%02d-%02d\n", date[i].y, date[i].m, date[i].d);
return 0;
}
四、其它题解
标签:date1,date2,第八届,int,蓝桥,Date,date,return,省赛 来源: https://blog.csdn.net/Derrickhang/article/details/123642865