HDOJ 2020 尝试结构体的归并排序,正常只要abs排嘛我知道...

本文介绍了一种针对整数集合的排序算法,该算法能够根据整数的绝对值进行从大到小的排序,并确保所有数值的绝对值不相等。通过使用结构体存储原始值及其符号来实现这一目标,利用归并排序方法完成排序过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Problem Description
输入n(n<=100)个整数,按照绝对值从大到小排序后输出。题目保证对于每一个测试实例,所有的数的绝对值都不相等。
 
Input
输入数据有多组,每组占一行,每行的第一个数字为n,接着是n个整数,n=0表示输入数据的结束,不做处理。 
 
Output
对于每个测试实例,输出排序后的结果,两个数之间用一个空格隔开。每个测试实例占一行。
 
Sample Input
3 3 -4 2 4 0 1 2 -3 0
 
Sample Output
-4 3 2 -3 2 1 0
已AC:
#include <iostream>
#include <cmath>
struct node
{
    int a;
    int b;
};
void Merge(node *ps, int p, int q, int r);
void MergeSort(node * ps, int a, int b);

int main()
{
    using namespace std;
    int n;

    while(cin >> n && n)
    {
        node * ptr = new node [n];
        for(int i=0; i<n; ++i)
        {
            int m;
            cin >> m;
            ptr[i].a = abs(m);
            if(m>=0)
                ptr[i].b = 1;
            else
                ptr[i].b = -1;
        }
        MergeSort(ptr, 0, n-1);
        for(int i=0; i<n; ++i)
        {
            if(!i)
                cout << ptr[i].a*ptr[i].b;
            else
                cout << " " << ptr[i].a*ptr[i].b;
        }
        cout << endl;
        delete [] ptr;
    }
    return 0;
}


void Merge(node *ps, int p, int q, int r)
{
    int l = q-p+1;
    int k = r-q;
    node *L = new node [l+1];//不能node L[l+1]
    node *R = new node [k+1];//IDE上都可以过,OJ上居然CE,注意点!!
    int i, j;

    for(i=p,j=0; i<=q; ++i,++j)
        L[j] = ps[i];
    for(i=q+1,j=0; i<=r; ++i,++j)
        R[j] = ps[i];
    L[l].a = R[k].a = -1;

    i = j = 0;
    for(int m=p; m<=r; ++m)
    {
        if(L[i].a>R[j].a)
            ps[m] = L[i++];
        else
            ps[m] = R[j++];
    }
    delete [] L;
    delete [] R;
}

void MergeSort(node * ps, int a, int b)
{
    if(a<b)
    {
        int mid = (a+b)/2;
        MergeSort(ps, a, mid);
        MergeSort(ps, mid+1, b);
        Merge(ps, a, mid, b);
    }
}


<think>嗯,用户想知道在杭电OJ(HDOJ)的第100题中,也就是题号从2000到2099之间,哪道题开始涉及到结构体序。首先,我需要回忆一下这些题目的内容,或者查找相关资料。 结构体序通常涉及到自定义序规则,比如按照多个条件对结构体中的字段进行序。在编程题中,这类问题常见于需要对一组数据进行特定规则序的情况,比如学生成绩按分数和姓名序,或者事件按时间序等。 接下来,我需要回顾HDOJ的题目列表,特别是2000到2099题号范围内的题目。可能需要逐个查看这些题目,找出需要结构体序的题目。不过,由于记忆有限,可能需要借助以往的解题经验或者在线资源来确认。 比如,HDOJ 2020题是绝对值序,但这里可能只需要对数值进行绝对值处理后再序,可能不需要结构体HDOJ 2033题是关于时间相加的,可能也不涉及结构体HDOJ 2040题是亲和数,可能也不涉及序。 再往后的题目中,HDOJ 2076题是计算夹角,可能不需要结构体HDOJ 2093题是考试名,这个题目可能需要结构体,因为需要处理学生的多个属性(解题数和罚时),并根据这些属性进行序。这可能是一个需要结构体序的题目。 不过,我需要进一步确认题号。比如,HDOJ 2093的题目描述是否真的需要结构体。根据回忆,考试名问题通常要求按解题数目从多到少,再按罚时从少到多序,这就需要定义一个结构体存储每个学生的信息,然后自定义比较函数进行序。因此,HDOJ 2093可能是一个涉及结构体序的题目。 此外,HDOJ 2023题是求平均成绩,可能需要结构体来存储学生和课程的信息,但可能不需要序。而HDOJ 2052题是图像旋转,可能不需要结构体HDOJ 2065题是"红色病毒"问题,属于数学或递推,也不涉及结构体。 因此,在2000到2099范围内,HDOJ 2093可能是第一个需要结构体序的题目。当然,可能还有其他题目更早涉及,比如HDOJ 2027统计元音可能需要结构体来存储各个元音的数量,但序可能不是主要部分。需要进一步确认。 可能还需要检查HDOJ 2000到2099的列表,例如HDOJ 2039题是判断三角形,可能不需要结构体HDOJ 2043题是密码安全性检查,也不涉及结构体HDOJ 2054题是大数比较,可能也不需要结构体。 综上,HDOJ 2093考试名应该是这个范围内较早涉及结构体序的题目。用户可能需要从这道题开始练习结构体序的应用。</think>在杭电OJ(HDOJ)的 **2000-2099** 题号范围内,涉及结构体序的典型题目是 **HDOJ 2093(考试名)**。以下是逐步说明: --- ### **1. 题目背景** **HDOJ 2093(考试名)** 要求根据学生的比赛成绩进行名。需要处理以下规则: - **解题数**从高到低序。 - 若解题数相同,按 **总罚时** 从低到高序。 - 若解题数和罚时都相同,按 **姓名** 字典序序。 这种多条件序需要定义结构体存储学生信息,并自定义序规则。 --- ### **2. 结构体定义** 首先定义一个结构体存储每个学生的信息: ```cpp struct Student { string name; // 学生姓名 int solved; // 解题数 int penalty; // 总罚时 }; ``` --- ### **3. 自定义序规则** 在C++中,通过自定义比较函数实现多条件序: ```cpp bool compare(const Student &a, const Student &b) { if (a.solved != b.solved) { return a.solved > b.solved; // 解题数降序 } else if (a.penalty != b.penalty) { return a.penalty < b.penalty; // 罚时升序 } else { return a.name < b.name; // 姓名字典序升序 } } ``` --- ### **4. 题目关键点** - **输入处理**:需要解析每行输入中的解题时间和罚时。 - **数据存储**:使用结构体数组或`vector<Student>`存储所有学生信息。 - **序调用**:使用`sort()`函数并传入自定义的`compare`函数。 --- ### **5. 其他可能涉及结构体序的题目** 在2000-2099范围内,以下题目也可能涉及结构体序: - **HDOJ 2023(求平均成绩)**:可能需要结构体存储学生多门课程的成绩,但序不是核心。 - **HDOJ 2068(RPG的错)**:不涉及结构体序。 - **HDOJ 2080(夹角有多大II)**:无需结构体。 --- ### **总结** 建议从 **HDOJ 2093(考试名)** 开始练习结构体序。掌握该题后,可尝试更复杂题目(如多字段序或动态条件序)。其他结构体序的经典题分布在 **2100+** 题号范围(如HDOJ 2138)。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值