2026/4/16 19:36:22
网站建设
项目流程
安徽建站费用,修改不能编辑的wordpress,微信小程序开发代码教程,简述制作网站的主要流程最大N个数和最小N个数的和 华为OD机试 - 华为OD上机考试 100分题型 华为OD机试真题目录点击查看: 华为OD机试真题题库目录#xff5c;机考题库 算法考点详解
题目描述
给定一个数组#xff0c;编写一个函数来计算它的最大N个数与最小N个数的和。你需要对数组进行去重。
…最大N个数和最小N个数的和华为OD机试 - 华为OD上机考试 100分题型华为OD机试真题目录点击查看: 华为OD机试真题题库目录机考题库 算法考点详解题目描述给定一个数组编写一个函数来计算它的最大N个数与最小N个数的和。你需要对数组进行去重。说明数组中数字范围[0, 1000]最大N个数与最小N个数不能有重叠如有***重叠输入非法***返回-1输入非法返回-1输入描述第一行输入M M标识数组大小第二行输入M个数标识数组内容第三行输入NN表达需要计算的最大、最小N个数输出描述输出最大N个数与最小N个数的和用例1输入5 95 88 83 64 100 2输出342说明最大2个数[100,95],最小2个数[83,64], 输出为342。用例2输入5 3 2 3 4 2 2输出-1说明最大2个数[4,3],最小2个数[3,2], 有重叠输出为-1。题解思路逻辑分析 双指针使用集合对输入数组进行去重。将集合转换为数组此时判断数组长度 2 *n, 如果不成立则直接输出-1.因为会存在最大的数和最小的数重叠。将数组进行升序排序然后使用双指针计算大N个数与最小N个数的和。输出结果。c#includeiostream #includevector #includestring #include utility #include sstream #includealgorithm #includecmath #includeset using namespace std; int main() { int m,n; cin m; // 去重 set int uniqueNum; for (int i 0; i m; i) { int tmp; cin tmp; uniqueNum.insert(tmp); } cin n; vectorint nums(uniqueNum.begin(), uniqueNum.end()); int numLen nums.size(); // 会存在重叠 if (numLen 2 * n) { cout -1; return 0; } // 升序 sort(nums.begin(), nums.end()); int left 0, right numLen -1; int sum 0; // 它的最大N个数与最小N个数的和 while (n ! 0) { sum (nums[left] nums[right]); left; right--; n--; } cout sum; return 0; }JAVAimport java.io.*; import java.util.*; public class Main { public static void main(String[] args) throws Exception { Scanner sc new Scanner(System.in); int m sc.nextInt(); // 去重Set 自动去重 SetInteger uniqueNum new HashSet(); for (int i 0; i m; i) { uniqueNum.add(sc.nextInt()); } int n sc.nextInt(); // 转为数组 ListInteger nums new ArrayList(uniqueNum); int numLen nums.size(); // 会存在重叠 if (numLen 2 * n) { System.out.println(-1); return; } // 升序排序 Collections.sort(nums); int left 0, right numLen - 1; int sum 0; // 最大 n 个数 最小 n 个数 while (n ! 0) { sum nums.get(left) nums.get(right); left; right--; n--; } System.out.println(sum); } }Pythonimportsysdefmain():datalist(map(int,sys.stdin.read().strip().split()))mdata[0]idx1# 去重uniqueNumset()for_inrange(m):uniqueNum.add(data[idx])idx1ndata[idx]numslist(uniqueNum)numLenlen(nums)# 会存在重叠ifnumLen2*n:print(-1)return# 升序nums.sort()left,right0,numLen-1total0# 最大 n 个数 最小 n 个数whilen0:totalnums[left]nums[right]left1right-1n-1print(total)if__name____main__:main()JavaScriptconstreadlinerequire(readline);constrlreadline.createInterface({input:process.stdin,output:process.stdout});letinput[];rl.on(line,line{input.push(...line.trim().split(/\s/));});rl.on(close,(){letidx0;constmparseInt(input[idx],10);// 去重constuniqueSetnewSet();for(leti0;im;i){uniqueSet.add(parseInt(input[idx],10));}constnparseInt(input[idx],10);constnumsArray.from(uniqueSet);constnumLennums.length;// 会存在重叠if(numLen2*n){console.log(-1);return;}// 升序nums.sort((a,b)a-b);letleft0,rightnumLen-1;letsum0;letcntn;// 最大 n 个数 最小 n 个数while(cnt0){sumnums[left]nums[right];left;right--;cnt--;}console.log(sum);});Gopackagemainimport(bufiofmtossort)funcmain(){in:bufio.NewReader(os.Stdin)varmintfmt.Fscan(in,m)// 去重uniqueNum:make(map[int]bool)fori:0;im;i{varxintfmt.Fscan(in,x)uniqueNum[x]true}varnintfmt.Fscan(in,n)// 转为切片nums:make([]int,0,len(uniqueNum))fork:rangeuniqueNum{numsappend(nums,k)}numLen:len(nums)// 会存在重叠ifnumLen2*n{fmt.Println(-1)return}// 升序排序sort.Ints(nums)left,right:0,numLen-1sum:0// 最大 n 个数 最小 n 个数forn0{sumnums[left]nums[right]leftright--n--}fmt.Println(sum)}