每日一題 組隊競賽(貪心 排序)

2021-10-10 20:23:11 字數 1357 閱讀 8177

題目**

題目描述

牛牛舉辦了一次程式設計比賽,參加比賽的有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),表示每個參賽選手的水平值

輸出描述:

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

示例:

輸入:

2

5 2 8 5 1 5

輸出

解題思路隊伍的水平值等於該隊伍隊員中第二高水平值,為了所有隊伍的水平值總和最大的解法,也就是說每個隊伍的第二個值是盡可能大的值。所以實際值把最大值放到最右邊,最小是放到最左邊。

本題的主要思路是貪心演算法,貪心演算法其實很簡單,就是每次選值時都選當前能看到的區域性最解憂,所以這裡的貪心就是保證每組的第二個值取到能選擇的最大值就可以,我們每次盡量取最大,但是最大的數不可能是中位數,所以退而求其次,取每組中第二大的。舉例說明:

**展示

#include

#include

#include

using

namespace std;

intmain()

std::

sort

(a.begin()

,a.end()

);for(

int i = n;i <=

3* n -

2;i +=2

) cout<

}}

每日一題 83 分蘋果(貪心)

n 只奶牛坐在一排,每個奶牛擁有 ai 個蘋果,現在你要在它們之間轉移蘋果,使得最後所有奶牛擁有的蘋果數都相同,每一次,你只能從乙隻奶牛身上拿走恰好兩個蘋果到另乙個奶牛上,問最少需要移動多少次可以平分蘋果,如果方案不存在輸出 1。輸入描述 每個輸入包含乙個測試用例。每個測試用例的第一行包含乙個整數 ...

每日一題 92 快速排序

題目來自網路 題目 1 基於陣列的快速排序 題目 2 基於鍊錶的快速排序 題目 1 基於陣列的快速排序 思路 使用分治的思想,先選擇樞軸,之後執行一次劃分,並把原序列劃分兩個子串行,之後遞迴處理。int partition int narr,int nstart,int nend narr nsta...

每日一題30 拓補排序

所謂拓補排序就是確定圖中節點的一種順序,使得某些在別的節點訪問之前不能訪問到的節點排在後面。所以該演算法的核心是每一步選擇乙個沒有入度的節點,因為沒有入度意味著該節點沒有前驅,得到乙個節點後,就把以新得到的節點為起點的邊去除,從剩下的節點重複前面的過程直到所有節點都排好序或找不到乙個不具有入度的節點...