有两个序列a,b,大小都为n,序列元素的值任意整数,无序.
要求:通过交换a,b中的元素,使[序列a元素的和]与[序列b元素的和]之间的差最小。
例如:
int[] a = {100,99,98,1,2, 3};
int[] b = {1, 2, 3, 4,5,40};
求解思路:
当前数组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 - 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为止。
参考:
http://blog.csdn.net/v_july_v/article/details/6419466
分享到:
相关推荐
首先明确我们的目标函数,即希望最小化的目标是 `|sum(a) - sum(b)|`,其中 `sum(a)` 表示数组 `a` 中所有元素的总和,`sum(b)` 表示数组 `b` 中所有元素的总和。 #### 2. 操作规则 为了实现这一目标,我们需要进行...
要求:通过交换a,b中的元素,使[序列a元素的和]与[序列b元素的和]之间的差最小。 例如: var a=[100,99,98,1,2, 3]; var b=[1, 2, 3, 4,5,40]; 求解思路: 当前数组a和数组b的和之差为 A = sum(a) - sum(b) a的...
1. **选择排序:** 每次从未排序部分选择最小(或最大)的元素,放到已排序序列的末尾。 2. **冒泡排序:** 重复地遍历要排序的列表,比较每对相邻项,并交换顺序错误的元素。 3. **快速排序:** 通过一趟排序将待排...
其中一个典型的问题是关于两个序列的平衡,具体而言,如何通过交换两个序列中的元素,使得两个序列的元素和之间的差异达到最小。这个问题不仅考验了应聘者的逻辑思维,还要求他们能够熟练运用Python的基本数据结构和...
- **交换律**:\(A \cup B = B \cup A\) 和 \(A \cap B = B \cap A\)。 - **结合律**:\((A \cup B) \cup C = A \cup (B \cup C)\) 和 \((A \cap B) \cap C = A \cap (B \cap C)\)。 - **分配律**:\(A \cup (B \cap...
该问题源于《编程之美》中的2.18章节,同时也是July的《微软等公司面试100题》中的32题,主要探讨如何通过交换两个序列的元素,使得两个序列元素之和的差最小。这个问题的关键在于找到一种有效的交换策略,使得两个...
- `min_element`:找到容器中的最小元素。 - `mismatch`:找出两个范围中的第一个不匹配元素。 - `next_permutation`:得到下一个排列。 - `nth_element`:使第n个元素位于正确位置。 - `partial_sort`:部分...
- **求互不相邻元素和**:`sum2`函数需要找到数组中所有与任何其他元素都不相邻的元素(考虑上下左右及对角线方向的相邻关系)并计算它们的和。 - **对角线元素和**:当数组为正方形且边长为偶数时,`sum3`函数需...
本文主要涉及了三个编程相关的知识点:1) 最大公约数和最小公倍数的计算,2) 循环语句的使用,3) 数组在排序和序列生成中的应用。 1) 最大公约数(Greatest Common Divisor, GCD)和最小公倍数(Least Common ...
题目要求找到一个正整数序列\(a_1, a_2, \ldots, a_m\)中是否存在两个下标\(k\)和\(l\)(其中\(0 \leq k )),满足\(m | (a_{k+1} + a_{k+2} + \ldots + a_l)\)。 #### 解题思路 为了寻找满足条件的子序列,可以...
- **选择排序**:通过从未排序部分查找最小(或最大)元素,放到已排序序列的末尾。 - **二分搜索**:在有序数组中查找某一特定元素的高效算法。 **代码分析:** - **选择排序**: ```cpp void swap(int a[], int...
- **选择排序**:选择排序算法的工作原理是遍历列表以查找最小(或最大)元素,将其放置于排序序列的起始位置,然后从剩余未排序的元素中继续寻找最小(或最大)元素,然后放到已排序序列的末尾。以此类推,直到所有...
- `sum2` 函数需找到数组中从 A[0][0] 开始的所有互不相邻的元素之和。互不相邻意味着元素不能与它的上下左右及对角线上的任何元素相邻。 - `sum3` 函数假设 m=n 且为偶数,计算两条对角线(主对角线和副对角线)...
- **partial_sum**: 计算容器中元素的部分和序列。 - **partition**: 根据谓词将容器划分为两部分。 - **pop_heap**: 从堆中移除最大元素。 - **prev_permutation**: 生成序列的前一个排列。 - **push_heap**: 将...
- **A** 选项,“编译器中的词法分析”通常不会使用B+树,而是使用状态机或其他数据结构。 - **B** 选项,“关系数据库系统中的索引”经常使用B+树来提高查找效率,因为B+树能够有效地支持范围查询。 - **C** ...
- 将未排序的元素插入到已排序序列的适当位置。 - **归并排序(Merge Sort)** - 采用分而治之策略,递归地分割数组,然后合并已排序的子数组。 - **快速排序(Quick Sort)** - 通过选取一个“基准”元素,并将数组...
- 交换变量 `a` 和 `b` 的值,可以使用 `a, b = b, a` 的技巧。 - 程序填空题目涉及算法实现,例如计算校验码或模拟滴滴快车计费规则。 13. 数理思维建模: - 滴滴快车的计费模型可能涉及到里程费和时长费的计算...
- 找到 nums[i:] 中比 nums[i-1] 大的最小元素,交换它们。 - 将 nums[i:] 部分翻转。 --- 以上仅列举了部分 LeetCode 题目及解法概述。LeetCode 是一个非常优秀的编程练习平台,涵盖了大量经典算法题目,对于...
- 实现思路:类似于3Sum,但在查找过程中记录与目标值差距最小的组合。 - **2.1.10 4Sum** - 在数组中找到四个数之和等于零的所有组合。 - 实现思路:类似3Sum,先排序,再通过两层循环固定两个数,使用双指针法...
9. 对于给定的栈操作序列,SSXSXSSXXX,输入序列a, b, e, d, e,最终输出序列是C:e, C, b, d, a。 10. 在Windows中,最小化应用程序窗口意味着该应用仍在后台运行,答案是A。 11. 二叉树的性质表明,如果有15个度...