一,題目:有兩個序列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= b=
s=a=
b=三,第一種解法原始碼
#include using namespace std; class runclass ; void runclass::balancearray(int array1, int array2,int n1,int n2) bool ifcycle = true; int length = n1; while (ifcycle) } } } } int runclass::sum(int array,int n) return sum; } int main() ; int array2 = ; runclass a; a.balancearray(array1, array2,13,13); for(int i=0;i<13;i++) cout< 多表操作 1 型別 1 對1 1對多 主外來鍵 多對多 中間表 2 笛卡爾積 select from pet p,emp e where p.ren e.empno 3 子查詢 巢狀查詢 將查詢語句嵌入到某個查詢中 例 查詢 張三 所擁有的寵物資訊 select p.from pet p,emp e... 直到爺爺去世了我才知道爺爺的平凡和偉大,我才知道原來自己一直都生活在爺爺無形的庇護當中,我真的是幸福的不能再幸福了。只可惜這一切,都晚了。我爺爺的名是文忠,我想我太爺爺給爺爺起這個名字是想讓我爺爺能認書識字,做個先生。可實際上我的爺爺從來都沒上過學,記得小時候爺爺經常拿來個藥瓶讓我給他看看藥的名字,... 程序 1 什麼是程序 程序指的是乙個正在進行 執行的程式,程序是用來描述程式執行過程的虛擬概念 程序vs程式 程式 一堆 程序 程式的執行的過程 程序的概念起源於作業系統,程序是作業系統最核心的概念,作業系統其它所有的概念都是圍繞程序來 作業系統理論 1.作業系統是什麼?作業系統是乙個協調 管理 控...第三十二天
第三十二周總結
第三十二天