“逐步白_ z Zでも青が棲んでいる 2025-07-22 19:13 采纳率: 36.8%
浏览 7
已结题

帮我看下代码哪里有问题并请改正

帮我看下代码哪里有问题并请改正,是用构造结构 体,运算符重载>号的方法做的,这其实就是pair的底层算法原理,谢谢!
题目:

img

我的代码:

#include<bits/stdc++.h>
using namespace std;
int n,sum;
struct fufu {
    int h;
    int w;
    bool operator>(fufu other) {
        if (h != other.h) {
            return h > other.h;
        } 
        else {
            return w > other.w;
        }
    }
};
int main() {
    cin >> n;
    fufu s[100];
    for (int i = 1; i <= n; i++) {
        cin >> s[i].h >> s[i].w;
    }
    for (int i = 1; i <= n - 1; i++) {
        for (int j = 1; j <= n - i; j++) {
            if (s[j] > s[j + 1]) {
                swap(s[j], s[j + 1]);
                sum++;
            }
        }
    }
    cout <<sum<< endl;
    return 0;
}


请大家帮帮忙吧!Thanks~~

  • 写回答

4条回答 默认 最新

  • 宝码香车 优质创作者: JavaScript技术领域 2025-07-22 19:18
    关注

    让【宝码香车】来帮你解答,本回答参考DeepSeek编写,并整理提供。

    如果还有疑问可以点击头像关注私信或评论。如果答案让您满意,请采纳、点赞、关注,非常感谢!
     
    若您愿意支持,欢迎直接打赏,将不胜感激!
     

    根据题目要求和代码分析,我发现几个问题需要修正:

    1. 题目要求从高到低排序,但代码实现的是从小到大排序(冒泡排序默认升序)
    2. 数组索引应从0开始而不是1开始(C++标准)
    3. 冒泡排序效率较低,建议使用更高效的逆序对计算方法
    4. 结构体比较运算符重载方向与题目要求不符

    修正后的代码如下:

    #include <iostream>
    #include <algorithm>
    using namespace std;
    
    
    struct Student {
        int h;
        int w;
        // 重载>运算符,按题目要求:身高从高到低,体重从重到轻
        bool operator>(const Student& other) const {
            if (h != other.h) return h > other.h;
            return w > other.w;
        }
        // 需要重载<运算符用于标准库排序
        bool operator<(const Student& other) const {
            if (h != other.h) return h < other.h;
            return w < other.w;
        }
    };
    
    
    int main() {
        int n;
        cin >> n;
        Student s[n];
        
        for (int i = 0; i < n; i++) {
            cin >> s[i].h >> s[i].w;
        }
        
        // 计算逆序对数量(最少交换次数)
        int swaps = 0;
        for (int i = 0; i < n; i++) {
            for (int j = i + 1; j < n; j++) {
                if (s[i] < s[j]) {  // 如果前面的元素比后面的小,说明需要交换
                    swaps++;
                }
            }
        }
        
        cout << swaps << endl;
        return 0;
    }
    

    算法优化说明:

    "开始"

    主要改进点:

    1. 修正了排序方向,现在符合题目要求的从高到低排序
    2. 使用更高效的逆序对计算方法,时间复杂度仍为O(n²)但更准确
    3. 遵循C++数组索引从0开始的惯例
    4. 添加了const修饰符保证比较操作的安全性
    5. 补充了<运算符重载以便使用标准库函数

    对于大规模数据(n>1e4),建议使用归并排序计算逆序对,可将时间复杂度优化到O(nlogn)。当前解法适合题目给出的内存限制(512MB)和时间限制(1.0s)。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(3条)

报告相同问题?

问题事件

  • 系统已结题 7月30日
  • 已采纳回答 7月22日
  • 创建了问题 7月22日