`

【100题】第三十二 数组、规划

 
阅读更多
一,题目:有两个序列a,b,大小都为n,序列元素的值任意整数,无序;要求:通过交换a,b中的元素,使[序列a元素的和]与[序列b元素的和]之间的差最小。
例如:
var a=[100 ,99 ,98 ,1 ,2 ,3]; var b=[1, 2, 3, 4, 5, 40];
有两个序列a,b,大小都为n,序列元素的值任意整数,无序;
要求:通过交换a,b中的元素,使[序列a元素的和]与[序列b元素的和]之间的差最小。

二,分析

第一种算法:
当前数组a和数组b的和之差为
A = sum(a) - sum(b)

a的第i个元素和b的第j个元素交换后,a和b的和之差为
A' = sum(a) - a[i] + b[j] - (sum(b)- b[j] + a[i])
= sum(a) - sum(b) - 2 (a[i] - b[j])
= A - 2 (a[i] - b[j])

设x= a[i] - b[j]
|A| - |A'| = |A| - |A-2x|

假设A> 0,
当x在(0,A)之间时,做这样的交换才能使得交换后的a和b的和之差变小,
x越接近A/2效果越好,
如果找不到在(0,A)之间的x,则当前的a和b就是答案。

所以算法大概如下:
在a和b中寻找使得x在(0,A)之间并且最接近A/2的i和j,交换相应的i和j元素,
重新计算A后,重复前面的步骤直至找不到(0,A)之间的x为止。

第二种算法:
1.将两序列合并为一个序列,并排序,为序列Source
2.拿出最大元素Big,次大的元素Small
3.在余下的序列S[:-2]进行平分,得到序列max,min
4.将Small加到max序列,将Big加大min序列,重新计算新序列和,和大的为max,小的为min。

a={1,2,3,4,5} b={6,7,8,9,10}

s={1,2,3,4,5,6,7,8,9,10}

a={1,3,6,7,10}

b={2,4,5,8,9}

三,第一种解法源码



分享到:
评论

相关推荐

    c语言数组练习题及答案

    该函数返回数组中的第二大值的位置。 **解题思路**: - 初始化最大值和次大值的位置。 - 遍历数组,更新最大值和次大值的位置。 **代码示例**: ```c int fun(int a[], int n) { int i, j, max, may; if (a[0] >...

    C语言数组练编程习题

    2. **转换为二进制:** 使用除2取余的方法将十进制数转换为二进制数,并存储到数组`binary[32]`中。 ```c int decimal, binary[32], i = 0, quotient; quotient = decimal / 2; binary[i] = decimal % 2; ...

    python-剑指offer第32题把数组排成最小的数

    python python_剑指offer第32题把数组排成最小的数

    单元习题中关于数组的一些程序填空解答.

    - **解析:** 这段代码的作用是将一个十进制数转换成二进制数并输出。当输入18时,其二进制表示为10010。 - **填空:** ```c main() { int x, y, i, a[8], j, u, v; scanf("%d", &x); y = x; i = 0; do ...

    C语言程序设计题库 第七章:数组

    如果声明了`int a[8] = {1, 2, 3}`,虽然只有三个元素被初始化,但整个数组仍然占用8个元素的内存空间,即32字节(假设一个`int`占4字节)。未初始化的元素默认值为0。 5. 计算与数组操作 在C程序中,可以使用数组...

    数据结构试题分章节考研题及答案.rar

    第三 章、栈和队列 试题 参考答案 第四章、串 试题 参考答案 第五章、数组和广义表 试题 参考答案 第六章、树和二叉树 试题 参考答案 第七章、图 试题 参考答案1 参考答案2 第八章、动态存储管理 试题 参考...

    全国大学生数学竞赛近十年试题(非数组),报名参赛的小白必做!附送十年决赛试题

    1. 第一届初赛试题中包含计算题、求极限题、填空题,覆盖了函数连续性的讨论、二阶偏导数的计算、极限的存在性证明等知识点。 2. 第二届初赛试题则可能涉及更复杂的极限计算,如无穷级数求和、方程组的求解等。 3. ...

    java算法题 : 数组相关问题

    例如,nums[0]表示数组的第一个元素。 2. 修改元素:直接通过索引赋值即可修改数组中的元素,如nums[2] = 10;。 3. 遍历数组:通常使用for循环来遍历数组,例如: ``` for(int i = 0; i ; i++) { System.out....

    c语言中 数组名和指针的区别

    例如,在WIN32平台上,`sizeof`操作符用于获取对象或类型所占的字节数,对于数组名,它返回的是整个数组所占的字节数,而对于指针变量,它只返回指针本身的字节数(通常为4或8字节)。 #### 1.2 数组名神似指针 ...

    第6章-数组和字符串-练习题.pdf

    本资源摘要信息是关于数组和字符串的练习题,共15道选择题,涵盖了数组和字符串的基本概念、数组下标、数组初始化、数组元素访问、字符串数组、数组拷贝等知识点。 一、数组基本概念 * 数组是一种数据结构,用于...

    程序员面试题100题(63)-数组中三个只出现一次的数字[算法].pdf,这是一份不错的文件

    例如,对于十进制数6(二进制为0110),`f(6)`的结果为2(二进制为0010)。 题目中提到,对于非零的数字 `i`、`j`、`k`,`f(i)^f(j)^f(k)`的结果不为0。这里使用了异或操作(^),异或运算具有交换律和结合律,即 `...

    [第二部分]精选微软等公司结构+算法面试100题[41-60题]

    根据提供的信息,我们可以总结出这份文档包含了从第41题到第60题的数据结构与算法面试题目。这些题目是从微软等知名公司的面试题目中精选出来的,并由原作者进行了整理和发布。以下是对这些题目的详细解读: ### 第...

    数据结构第五章数组和广义表.pdf

    在习题十二中,我们讨论了广义表的操作,例如广义表 A=(a,b,(c,d),(e,(f,g))) ,则下面式子的值为( )。这个问题考查了广义表的操作。 在习题十三中,我们讨论了广义表的定义,例如广义表 ((a, b,c,d))的...

    文档-matlab 矩阵数组练习题

    - A1 = A(2,3):取数组A的第二行第三列的元素,结果为5。 - A2 = A(:,3):取数组A的第三列,结果为[3;6;9]。 - A3 = A(1,:):取数组A的第一行,结果为[1,2,3]。 - A4 = A(2:3,2:3):取数组A的第2到3行,第2到3列...

    指针与数组区别,实验与指导-数组指针字符串

    数组元素可以通过下标访问,例如 `a[0]` 访问数组 `a` 的第一个元素。数组的大小是固定的,不能在运行时改变。 指针和数组的区别 指针和数组的主要区别在于指针是变量,而数组是集合。指针变量可以存储其他变量的...

    第七章 数组PPT学习教案.pptx

    数组下标通常从0开始,因此在一维数组中,若数组名为a,长度为n,则a[0]是数组的第一个元素,a[n-1]则是最后一个元素。通过循环结构,我们可以便利数组中的每一个元素,实现数组的初始化、读取、修改等操作。例如,...

    数组练习题及答案.doc

    C选项第三行的初始化超过了定义的长度。正确的定义语句是D选项,即`double y[][3]={0};`,这定义了一个至少两行三列的二维浮点数数组,并用0初始化所有元素。 3. 实型数组的定义:选项A中`float a[3][ ];`的定义不...

    数据结构第4-5章数组广义表自测卷空题.docx

    4. 假设有60行70列的二维数组a[l-60,l-70]以列序为主序顺序存储,其基地址为10000,每个元素占2个存储单元,那么第32行第58列的元素a[32,58]的存储地址为。(无第。行第0列元素) 知识点:数组的存储结构和存储...

    大数据必学Java基础(二十六):数组的应用题

    要求出数组中的最大值,可以遍历整个数组,将第一个元素设为初始最大值,然后依次与数组中其他元素比较,如果发现有更大的元素,则更新最大值。最后,最大值即为遍历后的结果。如下所示: ```java int[] arr = {...

    数组分割1

    该问题源于《编程之美》中的2.18章节,同时也是July的《微软等公司面试100题》中的32题,主要探讨如何通过交换两个序列的元素,使得两个序列元素之和的差最小。这个问题的关键在于找到一种有效的交换策略,使得两个...

Global site tag (gtag.js) - Google Analytics