給定乙個整數組成的集合,集合中的整數各不相同,現在要將它分為兩個子集合,使得這兩個子集合的並為原集合、交為空集,同時在兩個子集合的元素個數n1與n2之差的絕對值|n1-n2|盡可能小的前提下,要求他們各自的元素之和s1和s2之差的絕對值|s1-s2|盡可能大。求|s1-s2|。
使用隨機選擇演算法的原理就是,求這個整數集合的第n/2大,同時根據這個數把集合分為兩個部分,使得其中乙個子集元素都不小於這個數,另乙個都大於這個數。基於隨機快速排序演算法思想。
#include #include #include #include #include using namespace std;
const int maxn = 100010;
int a[maxn], n;
int randpartition(int a, int left, int right)
a[left] = temp;
return left;
}void randselect(int a, int left, int right, int k)
else
}int main()
randselect(a, 0, n - 1, n / 2);
for (int i = 0; i < n / 2; ++i)
printf("%d\n", (sum - sum1) - sum1);
return 0;
}
排序演算法相關
1.1氣泡排序 氣泡排序的基本原理是 依次比較相鄰的兩個數,將大數放在前面,小數放在後面,也即首先比較第乙個和第二個數,將大數放在前面,小數放在後面。然後比較第2個數和第3個數,將大數放前,小數方後,依次直至比較最後兩個數。如此在第一輪最後的數必定是所有數中最小的,然後重複以上過程將所有小數放在最後...
演算法相關 快排遞迴 隨機數
題目要求 思想 include include include include includeusing namespace std const int maxn 100010 int a maxn n 尋找n 2大的數字的位置,並根據這個位置把陣列分成兩半 思想 隨機選擇乙個數,一趟快排,然後遞迴...
雜湊演算法相關梳理
1.基本概念 雜湊也成為 雜湊 任意長度的輸入,經過雜湊演算法變換成固定長度的輸出。雜湊值會產生碰撞,因為固定長度的雜湊值表示的範圍是有限的,但輸入值的範圍是無限的。通過原始資料通過相同的雜湊演算法可以計算出相同的雜湊值,但是通過雜湊值無法恢復原始資料 不同的雜湊演算法,雜湊值長度不同,但相同的雜湊...