题解 P1104 【生日】

· · 题解

蒟蒻一点小建议

看着题解里的大佬们用的各种神仙做法,我一个连结构体都一团浆糊的蒟蒻真的深感无力。。。

不过幸运的是我在买车票时由身份证得到了一个启发

所以在这里推荐一个稍微简单一点的做法吧

我就不贴完整代码了

首先呢我们要搞清楚一个重要规律

y=year,m=month,d=day,下同(小学都学过就不解释啦~)

常识告诉我们,表示年份的数字越小,生日越大(例如1990和1995);年份相同时,表示月份的数字越小生日越大(例如1990.7和1990.3);月份相同时,表示日期的数字越小生日越大(例如1990.7.31和1990.7.3)。【废话

所以我们为什么不可以把年+月+日摞成一个数字(生日数)呢?

我用测试数据举个例子,yangchu是1992.4.23, qiujingya是1993.10.13,luowen是1991.8.1, 我们把他写成yangchu,19920423;qiujingya,19931013,luowen,19910801的形式,其实就是省略中间的分割点重头到尾连在一起,就和身份证上显示生日的数一样

根据数字越小,生日越大的原理,我们可以用自带从小到大排序功能的sort函数对所有生日数进行排序,然后根据生日数的大小进行名字的输出不就行了吗?

以下是代码核心!

此处播放心太软

for (int 1=1;i<=n;i++)    //循环输入开始
{
   cin>>y[i]>>m[i]>>d[i];   //输入年份,月份和日期
  int s[i]=y[i]*10000+m[i]*100+d[i]*1; //计算生日数
  }
   sort(s+1,s+n+1);          //对生日数进行排序 

连结构体都不用,是不是很简单呢?