鱼C论坛

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

排序问题

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

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

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

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

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

使用sort排序时默认为升序,但在秒的时候升序的话,那不是就错了吗(应该不了解pair的一些用法)
Snipaste_2023-10-10_17-30-45.png
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2023-10-10 17:32:13 | 显示全部楼层
在使用 sort 排序时,默认是按照升序排列的。但如果要按照降序排列,可以在 sort 函数中传入一个比较函数,该函数返回 true 表示第一个参数应该排在第二个参数之前,返回 false 则表示第一个参数应该排在第二个参数之后。对于本题,可以定义一个比较函数,按照第二维的值降序排列,代码如下:

  1. bool cmp(pair<pair<int, int>, int> a, pair<pair<int, int>, int> b) {
  2.     return a.first.second > b.first.second;
  3. }

  4. int main() {
  5.     int n;
  6.     scanf("%d", &n);
  7.     pair<pair<int, int>, int> a[n];
  8.     for(int i = 0; i < n; i++) {
  9.         scanf("%d%d%d", &a[ i].first.first, &a[ i].first.second, &a[ i].second);
  10.     }
  11.     sort(a, a + n, cmp); // 传入比较函数
  12.     for(int i = 0; i < n; i++) {
  13.         printf("%d %d %d\n", a[ i].first.first, a[ i].first.second, a[ i].second);
  14.     }
  15.     return 0;
  16. }
复制代码


以上代码中, cmp 函数返回 true 表示第一个参数的第二维小于第二个参数的第二维,即第一个参数应该排在第二个参数之前,从而实现了按照第二维降序排列的功能。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-10-10 17:33:24 | 显示全部楼层
解题思路:
在给出的代码中,使用了pair<pair<int, int>, int>来表示时间信息。其中,pair<int, int>表示时和分,int表示秒。

默认情况下,sort函数会按照升序进行排序。但是在题目中要求秒是降序排列的,所以我们需要修改排序的方式。

可以通过自定义比较函数来实现这一点,具体的步骤如下:

1. 自定义一个比较函数cmp,用来定义pair<pair<int, int>, int>类型的元素的大小关系。
2. 在cmp函数中,首先比较第一个pairfirst成员变量(时),如果不相等则按照小时升序排序,如果相等则继续比较第二个pairfirst成员变量(分),最后再比较整个元素的second成员变量(秒)。
3. 在main函数中,使用sort函数并传入自定义的比较函数cmp,以实现按照要求的排序方式。
4. 最后,按照格式输出排序后的时间数组。

下面是修改后的代码:
  1. ++
  2. #include <cstdio>
  3. #include <algorithm>
  4. #include <utility>
  5. bool cmp(const std::pair<std::pair<int, int>, int>& a, const std::pair<std::pair<int, int>, int>& b) {
  6.     if (a.first.first != b.first.first) {
  7.         return a.first.first < b.first.first;
  8.     } else if (a.first.second != b.first.second) {
  9.         return a.first.second < b.first.second;
  10.     } else {
  11.         return a.second > b.second;
  12.     }
  13. }
  14. int main() {
  15.     int n;
  16.     scanf("%d", &n);
  17.     std::pair<std::pair<int, int>, int> a[n];
  18.     for(int i = 0; i < n; i++) {
  19.         scanf("%d%d%d", &a[i].first.first, &a[i].first.second, &a[i].second);
  20.     }
  21.     std::sort(a, a + n, cmp);
  22.    
  23.     for(int i = 0; i < n; i++) {
  24.         printf("%d %d %d\n", a[i].first.first, a[i].first.second, a[i].second);
  25.     }
  26.     return 0;
  27. }
复制代码
通过自定义的比较函数cmp,可以实现按照要求的排序方式,即在时相等的情况下,按照分升序排序,在分相等的情况下,按照秒降序排序。

希望能对你有所帮助!如果还有其他问题,请随时提问。

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-6-9 17:15

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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