80分至AC提示(只适用于大部分)
  • 板块P1104 生日
  • 楼主fushuoting
  • 当前回复3
  • 已保存回复3
  • 发布时间2025/2/8 10:59
  • 上次更新2025/2/8 13:38:01
查看原帖
80分至AC提示(只适用于大部分)
1385791
fushuoting楼主2025/2/8 10:59

我们大概分析一下这道题,就可以发现这是一个典型的结构体排序问题,如果有人不会,大体思路放在下面

创建结构体,把姓名以及对应的年月日放进去,然后用结构体数组a[101]来输入。
输入完之后,就用algorithm头文件里的sort去排序
如果循环是0到n-1,就用sort(a,a+n,cmp);
循环是1到n,就用sort(a+1,a+n+1,cmp);
由于结构体数组不能直接用sort排序,所以就得用bool类型的函数cmp来进一步去排序,cmp代码我放在文章最后面,需要的可以看一看。
cmp排序完成后,就可以直接输出了

这就是80分的基础操作

80分记录

很多人做到这一步就几乎不会了,但

我们要AC

AC看似很难,实际上十分的简单 我们只需好好对题目 读题目去吧!!!

通过几分钟的仔细阅读,我发现了这个:

(如果有两个同学生日相同,输入靠后的同学先输出)

所以我们只需在结构体增加一个顺序(例:int xs) 然后循环输入时就将xs标为循环变量i;

然后再cmp函数里最后return a.day<b.day的后面加个特判,就是判断a.day和b.day是否相同,然后在判断相同的else那块写上:

return a.sx>b.sx;//顺序靠后的先输出

这样就可以AC了

下面是cmp函数:

80分cmp:

bool cmp(people a,people b)//我的结构体用的名称是people
{
    if(a.year!=b.year)
    {
        return a.year<b.year;//年越小年龄越大
    }
    else if(a.month!=b.month)
    {
        return a.month<b.month;//月同理
    }
    else
    {
        return a.day<b.day;//日也一样
    }
}

100cmp:

bool cmp(people a,people b)
{
    if(a.year!=b.year)
    {
        return a.year<b.year;
    }
    else if(a.month!=b.month)
    {
        return a.month<b.month;
    }
    else if(a.day!=b.day)
    {
        return a.day<b.day;
    }
    else//我用的是sx,你们可以用其他的
    {
        return a.sx>b.sx;//输入靠后的先输出
    }
}

OK,完美收官

2025/2/8 10:59
加载中...