鱼C论坛

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

[已解决]牛客竞赛技巧

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

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

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

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

  3. typedef struct time
  4. {
  5.     int hour;
  6.     int second;
  7.     int minute;
  8. }Time;
  9. int cmp(Time t1,Time t2 )
  10. {
  11.     if(t1.hour!=t2.hour)
  12.         return t1.hour<t2.hour;
  13.     else
  14.     {
  15.             if(t1.minute!=t2.minute)
  16.                return t1.minute<t2.minute;
  17.            else
  18.             return t1.second<t2.second;
  19.     }
  20. }

  21. int main()
  22. {
  23.     int n;
  24.     scanf("%d",&n);
  25.     Time t[n];
  26.     for(int i=0;i<n;i++)
  27.     {
  28.         scanf("%d%d%d",&t[i].hour,&t[i].minute,&t[i].second);
  29.     }
  30.     std::sort(t,t+n,cmp);
  31.     for(int i=0;i<n;i++)
  32.     {
  33.         printf("%d %d %d\n",t[i].hour,t[i].minute,t[i].second);
  34.     }
  35.     return 0;
  36. }
复制代码

由于还没有学结构体,可以给一下注释吗,再顺便写一下其他解法,谢谢大佬
最佳答案
2023-10-10 17:01:12
这段代码定义了一个结构体Time,包含了时(hour)、分(minute)、秒(second)三个成员变量。然后定义了一个cmp函数,用于排序,按照时、分、秒的顺序进行排序。在主函数中,先输入n个时间,再用sort函数进行排序,最后输出排序后的时间。

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

  1. #include <cstdio>
  2. #include <algorithm>
  3. #include <utility>

  4. using namespace std;

  5. int main()
  6. {
  7.     int n;
  8.     scanf("%d", &n);
  9.     pair<pair<int, int>, int> a[n];
  10.     for(int i = 0; i < n; i++)
  11.     {
  12.         scanf("%d%d%d", &a[ i].first.first, &a[ i].first.second, &a[ i].second);
  13.     }
  14.     sort(a, a + n);
  15.     for(int i = 0; i < n; i++)
  16.     {
  17.         printf("%d %d %d\n", a[ i].first.first, a[ i].first.second, a[ i].second);
  18.     }
  19.     return 0;
  20. }
复制代码


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

  1. #include <cstdio>
  2. #include <algorithm>

  3. using namespace std;

  4. struct Time
  5. {
  6.     int hour, minute, second;
  7.     bool operator < (const Time &t) const
  8.     {
  9.         if(hour != t.hour) return hour < t.hour;
  10.         if(minute != t.minute) return minute < t.minute;
  11.         return second < t.second;
  12.     }
  13. };

  14. int main()
  15. {
  16.     int n;
  17.     scanf("%d", &n);
  18.     Time a[n];
  19.     for(int i = 0; i < n; i++)
  20.     {
  21.         scanf("%d%d%d", &a[ i].hour, &a[ i].minute, &a[ i].second);
  22.     }
  23.     sort(a, a + n);
  24.     for(int i = 0; i < n; i++)
  25.     {
  26.         printf("%d %d %d\n", a[ i].hour, a[ i].minute, a[ i].second);
  27.     }
  28.     return 0;
  29. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

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

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

  1. #include <cstdio>
  2. #include <algorithm>
  3. #include <utility>

  4. using namespace std;

  5. int main()
  6. {
  7.     int n;
  8.     scanf("%d", &n);
  9.     pair<pair<int, int>, int> a[n];
  10.     for(int i = 0; i < n; i++)
  11.     {
  12.         scanf("%d%d%d", &a[ i].first.first, &a[ i].first.second, &a[ i].second);
  13.     }
  14.     sort(a, a + n);
  15.     for(int i = 0; i < n; i++)
  16.     {
  17.         printf("%d %d %d\n", a[ i].first.first, a[ i].first.second, a[ i].second);
  18.     }
  19.     return 0;
  20. }
复制代码


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

  1. #include <cstdio>
  2. #include <algorithm>

  3. using namespace std;

  4. struct Time
  5. {
  6.     int hour, minute, second;
  7.     bool operator < (const Time &t) const
  8.     {
  9.         if(hour != t.hour) return hour < t.hour;
  10.         if(minute != t.minute) return minute < t.minute;
  11.         return second < t.second;
  12.     }
  13. };

  14. int main()
  15. {
  16.     int n;
  17.     scanf("%d", &n);
  18.     Time a[n];
  19.     for(int i = 0; i < n; i++)
  20.     {
  21.         scanf("%d%d%d", &a[ i].hour, &a[ i].minute, &a[ i].second);
  22.     }
  23.     sort(a, a + n);
  24.     for(int i = 0; i < n; i++)
  25.     {
  26.         printf("%d %d %d\n", a[ i].hour, a[ i].minute, a[ i].second);
  27.     }
  28.     return 0;
  29. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

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

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

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

解法一:使用二维数组存储时间
  1. #include <stdio.h>
  2. #include <algorithm>
  3. int main() {
  4.     int n;
  5.     scanf("%d", &n);
  6.    
  7.     int t[n][3]; // 使用二维数组存储时间
  8.    
  9.     for (int i = 0; i < n; i++) {
  10.         scanf("%d%d%d", &t[i][0], &t[i][1], &t[i][2]);
  11.     }
  12.    
  13.     std::sort(t, t + n); // 直接使用默认的升序排序
  14.    
  15.     for (int i = 0; i < n; i++) {
  16.         printf("%d %d %d\n", t[i][0], t[i][1], t[i][2]);
  17.     }
  18.    
  19.     return 0;
  20. }
复制代码

解法二:使用三个数组分别存储时、分、秒
  1. #include <stdio.h>
  2. #include <algorithm>
  3. int main() {
  4.     int n;
  5.     scanf("%d", &n);
  6.    
  7.     int hour[n], minute[n], second[n]; // 使用三个数组分别存储时、分、秒
  8.    
  9.     for (int i = 0; i < n; i++) {
  10.         scanf("%d%d%d", &hour[i], &minute[i], &second[i]);
  11.     }
  12.    
  13.     // 使用自定义的比较函数cmp进行排序
  14.     std::sort(hour, hour + n);
  15.     std::sort(minute, minute + n);
  16.     std::sort(second, second + n);
  17.    
  18.     for (int i = 0; i < n; i++) {
  19.         printf("%d %d %d\n", hour[i], minute[i], second[i]);
  20.     }
  21.    
  22.     return 0;
  23. }
复制代码

以上是两种改进的解法,分别使用二维数组和三个数组来存储时间,并且使用默认的升序排序或分别对时、分、秒进行排序。希望对你有帮助!如果你还有其他问题,请随时提出。

球一个最佳答案谢谢啦!这对我非常重要!
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-4-22 04:36

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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