题目链接
https://pintia.cn/problem-sets/994805260223102976/problems/994805293282607104
数据范围:
$0 <= N <= 10^5$
样例:
Input:
1 | 5 |
Output:
1 | 3 Tom John |
题目做法
这个题给的输入是比较复杂的,我们在判断是否是一个合理的序列的时候,如果是按照年月日的格式依次判断的话,显然是比较复杂的。
我们采用结构体来存储这个生日:
例如:
1 | typedef struct node |
我们写判断是否是一个合法生日的时候,就要写一下语句:
1 | if(a[i].year > 1814 || (a[i].year == 1814 && a[i].month > 9) || (a[i].year == 1814 && a[i].month = 9 && a[i].day > 6) ||a[i].year < 2014 || (a[i].year == 2014 && a[i].month < 9) || (a[i].year == 2014 && a[i].month = 9 && a[i].day < 6) ) |
并且我们在判断谁是最大生日/最小生日的时候,还要按照年月日依次判断,代码量冗余。
我们可以采用$string$的特性来进行比较。
直接把生日定义成一个$string$类型,$string$可以直接比较大小。
并且我们还可以进一步降低空间复杂度,我们不必开一个struct的数组类型,只需要保存当前的信息和现在当前的已经存在的最大/最小的生日名字信息即可。然后采用线性处理,没读入一个,先判断是否是一个合理的生日序列,然后我们更新当前的最大/最小生日即可。
比较过程可以直接采用$string$比较。【详见代码】
!!!坑点!!!
这个题最后题面说明是:
在一行中顺序输出有效生日的个数、最年长人和最年轻人的姓名,其间以空格分隔。
但是并没有给出一个特殊的样例,就是输出0的时候。如果没有有效的,输出0!!!并且后边不需要带空格 直接换行即可。
暗示:最后我们首先输出计数$cnt$, 然后我们再判断$cnt$是否为0,不为0时,输出最大最小。
【我觉得这就是一个傻逼题目的说明问题还有样例问题…..真的浪费时间】
代码
1 | /** |
总结点
- 一般复杂类型可以转换成字符串的问题,可以采用$STL$去解决。
- 输入输出一定要保持一致,不要$cout $和 $printf$混合使用[会发生莫名其妙的bug]