貪心演算法例題

2021-09-29 09:29:09 字數 1344 閱讀 1624

牛牛舉辦了一次程式設計比賽,參加比賽的有3*n個選手,每個選手都有乙個水平值a_i.現在要將這些選手進行組隊,一共組成n個隊伍,即每個隊伍3人.牛牛發現隊伍的水平值等於該隊伍隊員中第二高水平值。

例如:乙個隊伍三個隊員的水平值分別是3,3,3.那麼隊伍的水平值是3

乙個隊伍三個隊員的水平值分別是3,2,3.那麼隊伍的水平值是3

乙個隊伍三個隊員的水平值分別是1,5,2.那麼隊伍的水平值是2

為了讓比賽更有看點,牛牛想安排隊伍使所有隊伍的水平值總和最大。

如樣例所示:

如果牛牛把6個隊員劃分到兩個隊伍

如果方案為:

team1:, team2:, 這時候水平值總和為7.

而如果方案為:

team1:, team2:, 這時候水平值總和為10.

沒有比總和為10更大的方案,所以輸出10.

輸入描述:

輸入的第一行為乙個正整數n(1 ≤ n ≤ 10^5)

第二行包括3*n個整數a_i(1 ≤ a_i ≤ 10^9),表示每個參賽選手的水平值.

輸出描述:

輸出乙個整數表示所有隊伍的水平值總和最大值.

示例1:輸入2

5 2 8 5 1 5

輸出10

解題思路:每個組的水平值是每個組水平中等的那個人,所以實際水平高的人不能作為任何一組的水平值,所以應該讓實際水平次於最高的的人作為某一組的水平值,假設輸入為n = 3, 水平值為(已排序):1 2 3 4 5 6 7 8 9,那麼將9和8放在一組,8就是這一組的水平值,下一組就應該將7和6放在一組,讓6作為這一組的水平值。也就是排序後陣列的第3n-2,3n-4,3n-6……等資料相加輸出即可。

貪心演算法:

每次選值時都選當前能看到的區域性最解憂,所以這裡的貪心就是保證每組的第二個值取到能選擇的最大值就可以,我們每次取每組中第二大的作為這一組的水平值,因為資料已經排好序了,所以第二組的水平值的最大值應該為6,因為9和8已經作為上一組的最大值和次大值, 7作為這一組的最大值。當n = 3時, 假設輸入為1 2 3 4 5 6 7 8 9三組資料的最大值和次大值應為:9 8 [ ]    7 6 [ ] 5 4 [ ],這一組輸入的最大水平值之和為:8 + 6 + 4 = 18。

#include#include#includeusing namespace std;

int main()

sort(v.begin(), v.end());

int sum = 0;

for ( i = n; i <= 3*n-2; i+=2)

cout << sum << endl;

system("pause");

return 0;

}

貪心演算法例題

貪心演算法 greedy 分階段地工作,在每乙個階段都可以認為所做的決定是最好的,而不用考慮後果。這就意味著得到的是區域性最優解決方案,當演算法結束時,如果乙個乙個區域性最優解能組成全域性最優解決,那麼就說明這個演算法是正確的 如果不是,則此演算法的到的結果就是乙個次優解。因此,如果使用貪婪演算法得...

貪心演算法例題

貪心演算法 移除k個數字 1 題目描述 給定乙個以字串表示的非負整數 num,移除這個數中的 k 位數字,使得剩下的數字最小。注意 num 的長度小於 10002 且 k。num 不會包含任何前導零。2 題目分析 題目簡介明了,就是把給定的數字刪除指定個數的數字使刪除之後的數字是同等位數數字中最小的...

貪心演算法例題

例1 均分紙牌 int main printf 各堆紙牌的數量為 n intm for m 0 m n m printf d t a m printf n v v n printf 每堆牌的平均數為 d n v for i 0 i n 1 i printf 一共移動了 d步。n s printf 現...