题目
给定一个数组,编写一个函数,
计算他的最大N
个数和最小N
个数的和,
需要对数组进行去重。
输入
第一行输入M
,M
表示数组大小
第二行输入M
个数,表示数组内容
第三行输入N
表示需要计算的最大最小N
的个数
输出
输出最大N
个数和最小N
个数的和
示例一
输入
5
95 88 83 64 100
2
输出
342
说明
最大2
个数[100 95]
最小 2 个数[83 64]
输出342
示例二
输入
5
3 2 3 4 2
2
输出
-1
说明
最大2
个数是[4 3]
最小2
个数是[3 2]
有重叠输出为-1
思路
解题思路如下:
-
读取输入:
- 首先,程序读取数组的大小
M
。 - 然后,依次读取并存储数组中的
M
个整数到动态数组nums
中。 - 接着,读取需要计算的最大最小数的数量
N
。
- 首先,程序读取数组的大小
-
排序数组:
- 使用
qsort
函数对数组进行降序排序,以便后续可以快速找到最大和最小的数。
- 使用
-
数组去重:
- 遍历已排序的数组,当遇到重复元素时,将其从数组中移除。通过更新数组长度来保持有效数据范围。
-
计算结果:
- 初始化结果变量
res
为-1
,表示存在重复数字的情况下的输出结果。 - 检查经过去重处理后的数组长度是否大于等于
2 * N
。如果满足条件,则将结果初始化为0
并重新计算。 - 遍历数组,将位于数组两端(前
N
个和后N
个)的数累加到结果变量res
中。
- 初始化结果变量
-
输出结果:
- 输出最终计算得到的最大
N
个数和最小N
个数的和。
- 输出最终计算得到的最大
代码
#include <stdio.h>
#include <stdlib.h>// 定义一个比较函数,用于对整数数组进行降序排序
int cmp(const void *a, const void *b) {return *(int *)b - *(int *)a; // 返回 b - a 的值,实现降序排列
}int main() {int length;scanf("%d", &length); // 读取数组长度 M// 初始化动态数组 nums,用于存储输入的整数int nums[length];for (int i = 0; i < length; i++) {scanf("%d", &nums[i]); // 读取数组中的每个元素}int n;scanf("%d", &n); // 读取需要计算的最大最小 N 的个数// 使用 qsort 函数对数组进行降序排序qsort(nums, length, sizeof(int), cmp);// 对排序后的数组进行去重操作for (int i = 0; i < length - 1;) {if (nums[i] == nums[i + 1]) { // 如果当前元素与下一个元素相等(即重复)// 将重复元素移除并将后续元素前移for (int j = i; j < length - 1; j++)nums[j] = nums[j + 1];length--; // 数组有效长度减一} else {i++; // 若无重复,则继续检查下一个元素}}// 计算去重后数组中最大 N 个数和最小 N 个数的和int res = -1; // 初始化结果为 -1,表示有重复时的结果if (n * 2 <= length) { // 如果要去重后数组长度大于等于 2Nres = 0; // res置0,开始累加// 遍历数组,将前 N 个和后 N 个数累加到结果中for (int i = 0; i < length; i++) {if (i < n || i >= length - n) {res += nums[i];}}}printf("%d\n", res); // 输出最大 N 个数和最小 N 个数的和return 0;
}
文章目录
- 题目
- 输入
- 输出
- 示例一
- 输入
- 输出
- 说明
- 示例二
- 输入
- 输出
- 说明
- 思路
- 代码