上海计算机学会2021年9月月赛C++丙组T4最年长的人
发布时间
阅读量:
阅读量
任务要求在给定n个人的出生日期中找到年龄最大的(即出生最早的)并输出其出生日期。可以通过以下方法解决:
问题描述:给定n个日期(格式为YYYY-MM-DD),找出其中最小的日期并输出。
解决方法:
- 方法一:直接比较每个日期的年、月、日部分。
- 方法二:将每个日期转换为一个整数(如YYYY10000 + MM100 + DD),然后比较这些整数。
- 方法三:将每个日期作为字符串直接进行比较。
复杂度分析:- 方法一的时间复杂度为O(n),空间复杂度为O(1)。
- 方法二的时间复杂度为O(n),空间复杂度为O(1)。
- 方法三的时间复杂度为O(n),空间复杂度为O(1)。
适用范围:适用于n从1到1,00万的情况,并且保证输入数据的有效性。
最终输出结果应与输入格式一致(如YYYY-MM-DD)。
最年长的人
内存限制: 256 Mb时间限制: 1000 ms
题目描述
给定 n 个人的出生日期,请找出其中年龄最大的,并输出他的出生日期。
输入格式
第一行:单个整数 n;
第二行到第n+1行:每行格式如下:
四位整数变量 y 代表年份;
两位整数变量 m 用于表示月份;
两位整数变量 d 用于表示日期;
年、月、日之间通过减号分隔。
输出格式
一行字符串:表示最早的出生日期,格式同输入。
数据范围
在58.89%的样本中(即约64/64个案例中),变量n的取值范围限定于[64, 66]区间内。
在全部数据集中(即所有样本中),变量n的最大取值为一百万。
研究覆盖的时间段为一世纪至二世纪期间。
确保每个月份和日期均为两位数,并且符合实际有效的日期格式。
样例数据
输入:
4
2008-08-08
1953-06-15
1949-10-01
1926-08-18
输出:
1926-08-18
解析:
拿到题,最先想到的应该是将求最小的年月日,代码如下:
#include <bits/stdc++.h>
using namespace std;
int main()
{
int n;
cin>>n;
int my=2021,mm,md;//最小的出生年月日
for(int i=1;i<=n;i++){
int y,m,d;
scanf("%d-%d-%d",&y,&m,&d);
if (y<my){
my=y,mm=m,md=d;
}else if (my==y&&m<mm){
mm=m,md=d;
}else if (my==y&&mm==m&&d<md){
md=d;
}
}
printf("%02d-%02d-%02d",my,mm,md);
return 0;
}
进一步,我们可以把年月日换算成一个8位数,求最小值,代码如下:
#include <bits/stdc++.h>
using namespace std;
int main()
{
int n;
cin>>n;
int mi=20230000;//最小的出生年月日
for(int i=1;i<=n;i++){
int y,m,d;
scanf("%d-%d-%d",&y,&m,&d);
mi=min(mi,y*10000+m*100+d);
}
printf("%02d-%02d-%02d",mi/10000,mi/100%100,mi%100);
return 0;
}
再进一步,我们可以把日期当成一个字符串,求最小值,代码如下:
#include <bits/stdc++.h>
using namespace std;
int main()
{
int n;
cin>>n;
string mi="2023-00-00";//最小的出生年月日
for(int i=1;i<=n;i++){
string s;
cin>>s;
if (s<mi) mi=s;
}
cout<<mi;
return 0;
}
全部评论 (0)
还没有任何评论哟~
