寻找身高相近的小朋友

题目描述

小明今年升学到了小学1年级来到新班级后,发现其他小朋友身高参差不齐,然后就想基于各小朋友和自己的身高差,对他们进行排序,请帮他实现排序。

输入描述

第一行为正整数 h和n,0 第二行为n个正整数,h1 ~ hn分别是其他小朋友的身高,取值范围0

输出描述

输出排序结果,各正整数以空格分割,
和小明身高差绝对值最小的小朋友排在前面,
和小明身高差绝对值最大的小朋友排在后面,
如果两个小朋友和小明身高差一样,则个子较小的小朋友排在前面。

用例

输入

100 10
95 96 97 98 99 101 102 103 104 105

输出

99 101 98 102 97 103 96 104 95 105

说明

小明身高100,班级学生10个,身高分别为95 96 97 98 99 101 102 103 104 105,按身高差排序后结果为:99 101 98 102 97 103 96 104 95 105。

代码

// 引入必要的头文件,用于输入输出和内存管理
#include 
#include 

// 定义一个结构体person,包含小朋友的身高height和与小明身高的差值diff
typedef struct {
    int height;
    int diff;
} person;

// 自定义排序函数cmp,用于qsort进行排序
// 比较两个person结构体a和b,优先根据身高差diff升序排序
// 若diff相同,则按照小朋友的实际身高height升序排序
int cmp(const void *a, const void *b) {
    person *p1 = (person *)a;
    person *p2 = (person *)b;

    // 先按照身高差diff排序
    if (p1->diff != p2->diff) {
        return p1->diff - p2->diff;
    }
    // 若diff相等,则按照height(实际身高)升序排序
    else {
        return p1->height - p2->height;
    }
}

int main() {
    int h, n; // h代表小明的身高,n代表班级中小朋友的数量

    // 读取小明的身高和班级小朋友数量
    scanf("%d %d", &h, &n);

    // 创建一个大小为n的person数组,存储每个小朋友的信息
    person p[n];

    // 遍历读取所有小朋友的身高,并计算他们与小明身高的差值
    for (int i = 0; i < n; i++) {
        scanf("%d", &p[i].height);
        p[i].diff = abs(p[i].height - h); // 计算身高差并存入diff字段
    }

    // 使用qsort对person数组进行排序,根据自定义的cmp函数规则排序
    qsort(p, n, sizeof(person), cmp);

    // 输出排序后的结果,即按要求排列的所有小朋友的身高
    for (int i = 0; i < n; i++) {
        printf("%d ", p[i].height);
    }

    return 0;
}

文章目录

  • 题目描述
  • 输入描述
  • 输出描述
  • 用例
  • 说明
  • 代码

你可能感兴趣的:(刷题,c语言,华为od,数据结构)