首页 > 其他分享 >第1关:求解一个整数数组划分为两个子数组问题

第1关:求解一个整数数组划分为两个子数组问题

时间:2024-10-12 22:20:43浏览次数:8  
标签:A1 求解 int System 整数 high A2 low 数组

[TOC]求解一个整数数组划分为两个子数组问题

任务描述
已知由n(n>=2)个整数正整数构成的集合A={ak}(0<=k<n),将其划分为两个不相交的子集A1和A2,元素个数分别是n1和n2,A1和A2中的元素之和分别为S1和S2.设计一个尽可能高效的划分算法,满足|n1-n2|最小且|S1-S2|最大,算法返回|S1-S2|的结果.

本关任务:编写一个能返回|S1-S2|的结果的小程序。

解法提示
将A中最小的「n/2」个元素放在A1中,其他 元素放在A2中,即得到题目要求的结果.采用递归快速排序思路,查找第n/2小的元素,前半部分为A1的元素,后半部分为A2的元素,这样,算法的时间复杂度为O(n).如果将A中元素全部排序,再进行划分,时间复杂度为O(nlog2n),不如前面的方法.
输入描述:输入的第1行包含一个整数n,表示给定数字的个数;第2行包含n个整数,相邻的整数之间用一个空格分隔,表示给定的整数.

输出描述
输出三行,第1行输出求解结果,即|S1-S2|的值
第2、3行输出划分结果:
第2行输出A1:中的元素,空格隔开
第3行输出A2:中的元素,空格隔开

输入描述
输入一个整数n,表示元素的个数
再输入n个整数

编程要求
根据提示,在右侧编辑器补充代码,计算并输出|S1-S2|的结果。

测试说明
平台会对你编写的代码进行测试:

测试输入:9
4,3,5,7,9,2,1,6,8;
预期输出:
求解结果:25
划分结果:A1:2 3 1 4
A2:9 7 5 6 8

测试输入:5
15,13,12,100,20;
预期输出:
求解结果:110
划分结果:A1:12 13
A2:15 100 20

开始你的任务吧,祝你成功!

package step1;
import java.util.Arrays;
import java.util.Scanner;
 public class  Int_array_split_empty{
       /begin

 public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        
        
        int n = scanner.nextInt();
        
        int[] a = new int[n];
        
        for (int i = 0; i < n; i++) {
            a[i] = scanner.nextInt();
        }
        
        int result = solve(a, n);
        System.out.println("求解结果:" + result);
        
        System.out.print("划分结果:A1:");
        display(a, 0, n / 2 - 1);
        System.out.print("A2:");
        display(a, n / 2, n - 1);
        
        scanner.close();
    }

    public static int partition(int[] a, int low, int high) {
        int i = low, j = high;
        int pivot = a[low];
        while (i < j) {
            while (i < j && a[j] >= pivot) {
                j--;
            }
            a[i] = a[j];
            while (i < j && a[i] <= pivot) {
                i++;
            }
            a[j] = a[i];
        }
        a[i] = pivot;
        return i;
    }

    public static int solve(int[] a, int n) {
        int low = 0, high = n - 1;
        int flag = 1;
        while (flag != 0) {
            int i = partition(a, low, high);
            if (i == n / 2 - 1) {
                flag = 0;
            } else if (i < n / 2 - 1) {
                low = i + 1;
            } else {
                high = i - 1;
            }
        }
        
        int s1 = 0, s2 = 0;
        for (int i = 0; i < n / 2; i++) {
            s1 += a[i];
        }
        for (int j = n / 2; j < n; j++) {
            s2 += a[j];
        }
        return s2 - s1;
    }

    public static void display(int[] a, int low, int high) {
        for (int i = low; i <= high; i++) {
            System.out.print(a[i] + " ");
        }
        System.out.println();
    }
}

标签:A1,求解,int,System,整数,high,A2,low,数组
From: https://blog.csdn.net/qq_43055855/article/details/142889069

相关文章

  • 浮点数取整数部分
    在C语言中,可以通过以下几种方法获取浮点数的整数部分(不进行四舍五入):1.类型转换法(简单):直接将浮点数转换为整数类型,舍弃小数部分。#include<stdio.h>intmain(){floatf=123.456;inti=(int)f;//i的值为123printf("整数部分:%d\n",i);......
  • Java将数组转换成字符串
    Java将数组转换成字符串1.使用Arrays.toString()对于一维数组,可以使用java.util.Arrays类中的toString()方法:importjava.util.Arrays;publicclassMain{publicstaticvoidmain(String[]args){int[]nums={1,2,3,4,5};String......
  • 链表排序算法(C++):数组辅助排序、插入排序、归并排序
    文章目录借助数组排序插入排序归并排序测试用例数组排序算法参考:冒泡排序、插入排序、选择排序、归并排序、快速排序算法(C++实现)-CSDN博客链表排序算法参考:链表排序总结(全)(C++)-CSDN博客这里主要介绍三种链表排序方法,第一种是借助数组进行排序的方法,第二种是插入排......
  • 【C++差分数组】P1672何时运输的饲料
    本文涉及知识点C++差分数组C++算法:前缀和、前缀乘积、前缀异或的原理、源码及测试用例包括课程视频P1672何时运输的饲料原文比较啰嗦,我简述一下:第x天运来F1(1<=F1<=1e6)千克的饲料,第D(1<=2e3)天还剩F2(1<=F2<=F1)千克饲料,某人养了C头牛,moves[i]={comi,leavei},表......
  • 免费解锁数学难题——体验Math.now AI数学求解器
    摘要:想要快速解决数学问题,获得分步解答吗?Math.now是一款免费且强大的AI数学求解器,基于先进的MathGPT技术,无论是代数、几何,还是微积分,它都能提供精准的解答,帮助你轻松掌握每个数学概念。作为一名数学爱好者,我最近发现了一个强大的工具——Math.now,这是一个基于AI的免费在线数学求......
  • 第6周 6.2 多维数组
    3.9.3二维数据创建二维数组主要用于二维关系表示。二维数组可以分规则二维数组和不规则二维数组。规则二维数组表示行列数相同的二维数组,不规则二维数组表示行列数不同的二维数组。1.定义二维数组熂类型名[][]数组名=new数据类型[行数][列数];2.二维数据初始化和遍历......
  • 第6周 6.1 一维数组
    6.数组编程语言中通常用变量来描述零散的、相互没有联系的单个数据,用数组来描述一组相互有联系的数据。Java数组是具有相同数据类型的一组数据组成的、有序的集合,数组中的每个数据称为元素,每个元素都有一个编号,这个编号称为下标,下标从0开始。java中数组是引用类型,数组元素可以......
  • 59螺旋数组
    按照边遍历的顺序进行赋值,可以将整个任务分为多个螺旋完成,每个螺旋按边打印。最外层螺旋起始分别是(0,0)->(0,n-1)->(n-1.n-1)->(n-1,0)->(1,0),螺旋的最后一条边会比前三条短1,同时每次更新打印螺旋需要注意螺旋的边会减少1,因此在每层螺旋的最后一条边打印前更新长度即可。最后注意......
  • 【汇总】Linux shell 数组使用
    前言全局说明【汇总】Linuxshell数组使用一、说明环境:Ubuntu18.04.6LTS(Linuxqt-vm5.4.0-150-generic#167~18.04.1-UbuntuSMPWedMay2400:51:42UTC2023x86_64x86_64x86_64GNU/Linux)二、创建数组2.1声明一个空数组test_array=()2.2创建数组test......
  • mongo对文档中数组进行过滤的三种方法
    前言在mongo中数据类型有很多种,常见的包括:数据类型例子描述String{"x":"foot"}字符串。存储数据常用的数据类型。在MongoDB中,UTF-8编码的字符串才是合法的。Integer{"x":1}整型数值。用于存储数值。根据你所采用的服务器,可分为32位或64位。......