鱼C论坛

 找回密码
 立即注册
查看: 1216|回复: 2

[已解决]牛客竞赛技巧

[复制链接]
发表于 2023-10-10 17:00:26 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
题目:https://ac.nowcoder.com/acm/problem/15056
#include <stdio.h>
#include <algorithm>

typedef struct time
{
    int hour;
    int second;
    int minute;
}Time;
int cmp(Time t1,Time t2 )
{
    if(t1.hour!=t2.hour)
        return t1.hour<t2.hour;
    else 
    {
            if(t1.minute!=t2.minute)
               return t1.minute<t2.minute;
           else
            return t1.second<t2.second;
    }
}

int main()
{
    int n;
    scanf("%d",&n);
    Time t[n];
    for(int i=0;i<n;i++)
    {
        scanf("%d%d%d",&t[i].hour,&t[i].minute,&t[i].second);
    }
    std::sort(t,t+n,cmp);
    for(int i=0;i<n;i++)
    {
        printf("%d %d %d\n",t[i].hour,t[i].minute,t[i].second);
    }
    return 0;
}
由于还没有学结构体,可以给一下注释吗,再顺便写一下其他解法,谢谢大佬
最佳答案
2023-10-10 17:01:12
这段代码定义了一个结构体Time,包含了时(hour)、分(minute)、秒(second)三个成员变量。然后定义了一个cmp函数,用于排序,按照时、分、秒的顺序进行排序。在主函数中,先输入n个时间,再用sort函数进行排序,最后输出排序后的时间。

除了使用结构体,还可以使用pair来存储时间,然后按照pair的第一个元素和第二个元素进行排序,具体代码如下:
#include <cstdio>
#include <algorithm>
#include <utility>

using namespace std;

int main()
{
    int n;
    scanf("%d", &n);
    pair<pair<int, int>, int> a[n];
    for(int i = 0; i < n; i++)
    {
        scanf("%d%d%d", &a[ i].first.first, &a[ i].first.second, &a[ i].second);
    }
    sort(a, a + n);
    for(int i = 0; i < n; i++)
    {
        printf("%d %d %d\n", a[ i].first.first, a[ i].first.second, a[ i].second);
    }
    return 0;
}

此外,还可以使用结构体的比较运算符重载来进行排序,具体代码如下:
#include <cstdio>
#include <algorithm>

using namespace std;

struct Time
{
    int hour, minute, second;
    bool operator < (const Time &t) const
    {
        if(hour != t.hour) return hour < t.hour;
        if(minute != t.minute) return minute < t.minute;
        return second < t.second;
    }
};

int main()
{
    int n;
    scanf("%d", &n);
    Time a[n];
    for(int i = 0; i < n; i++)
    {
        scanf("%d%d%d", &a[ i].hour, &a[ i].minute, &a[ i].second);
    }
    sort(a, a + n);
    for(int i = 0; i < n; i++)
    {
        printf("%d %d %d\n", a[ i].hour, a[ i].minute, a[ i].second);
    }
    return 0;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-10-10 17:01:12 | 显示全部楼层    本楼为最佳答案   
这段代码定义了一个结构体Time,包含了时(hour)、分(minute)、秒(second)三个成员变量。然后定义了一个cmp函数,用于排序,按照时、分、秒的顺序进行排序。在主函数中,先输入n个时间,再用sort函数进行排序,最后输出排序后的时间。

除了使用结构体,还可以使用pair来存储时间,然后按照pair的第一个元素和第二个元素进行排序,具体代码如下:
#include <cstdio>
#include <algorithm>
#include <utility>

using namespace std;

int main()
{
    int n;
    scanf("%d", &n);
    pair<pair<int, int>, int> a[n];
    for(int i = 0; i < n; i++)
    {
        scanf("%d%d%d", &a[ i].first.first, &a[ i].first.second, &a[ i].second);
    }
    sort(a, a + n);
    for(int i = 0; i < n; i++)
    {
        printf("%d %d %d\n", a[ i].first.first, a[ i].first.second, a[ i].second);
    }
    return 0;
}

此外,还可以使用结构体的比较运算符重载来进行排序,具体代码如下:
#include <cstdio>
#include <algorithm>

using namespace std;

struct Time
{
    int hour, minute, second;
    bool operator < (const Time &t) const
    {
        if(hour != t.hour) return hour < t.hour;
        if(minute != t.minute) return minute < t.minute;
        return second < t.second;
    }
};

int main()
{
    int n;
    scanf("%d", &n);
    Time a[n];
    for(int i = 0; i < n; i++)
    {
        scanf("%d%d%d", &a[ i].hour, &a[ i].minute, &a[ i].second);
    }
    sort(a, a + n);
    for(int i = 0; i < n; i++)
    {
        printf("%d %d %d\n", a[ i].hour, a[ i].minute, a[ i].second);
    }
    return 0;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-10-10 17:02:20 | 显示全部楼层
解题思路:
首先,给出的代码使用了结构体Time来表示时间,结构体中包含了时、分、秒三个成员变量。然后,使用std::sort函数对时间数组进行排序,排序的依据是自定义的cmp比较函数。

cmp函数中,首先比较两个时间的时,如果不相等则按照小时升序排序,相等则继续比较分钟,再相等则比较秒。这样可以保证整个数组按照时间升序排列。

最后,遍历排序后的数组,按照格式输出时间。

由于你没有学习结构体,我可以给你提供两种改进的解法:

解法一:使用二维数组存储时间
#include <stdio.h>#include <algorithm>int main() {    int n;    scanf("%d", &n);        int t[n][3]; // 使用二维数组存储时间        for (int i = 0; i < n; i++) {        scanf("%d%d%d", &t[i][0], &t[i][1], &t[i][2]);    }        std::sort(t, t + n); // 直接使用默认的升序排序        for (int i = 0; i < n; i++) {        printf("%d %d %d\n", t[i][0], t[i][1], t[i][2]);    }        return 0;}
解法二:使用三个数组分别存储时、分、秒
#include <stdio.h>#include <algorithm>int main() {    int n;    scanf("%d", &n);        int hour[n], minute[n], second[n]; // 使用三个数组分别存储时、分、秒        for (int i = 0; i < n; i++) {        scanf("%d%d%d", &hour[i], &minute[i], &second[i]);    }        // 使用自定义的比较函数cmp进行排序    std::sort(hour, hour + n);    std::sort(minute, minute + n);    std::sort(second, second + n);        for (int i = 0; i < n; i++) {        printf("%d %d %d\n", hour[i], minute[i], second[i]);    }        return 0;}
以上是两种改进的解法,分别使用二维数组和三个数组来存储时间,并且使用默认的升序排序或分别对时、分、秒进行排序。希望对你有帮助!如果你还有其他问题,请随时提出。

球一个最佳答案谢谢啦!这对我非常重要!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-12-23 20:19

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表