牛牛舉辦了一次程式設計比賽,參加比賽的有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
.
隊伍的水平值等於該隊伍隊員中第二高水平值,為了所有隊伍的水平值總和最大的解法,也就是說每個隊伍的第二個值是盡可能大的值。所以實際值把最大值放到最右邊,最小是放到最左邊。
本題的主要思路是貪心演算法,貪心演算法其實就是每次選值時都選當前能看到的區域性最優解。所以這裡的貪心就是保證每組的第二個值取到能選擇的最大值就可以。
我們每次盡量取最大,但是最大的數不可能是中位數,所以退而求其次,取每組中第二大的排序,然後取下標為3n - 2
,3n - 4
,3n - 4
…n+2
,n
位置的元素累加即可,相當下標為[0,n-1]
的n個數做每組的最左邊的數,剩下的2
個資料兩個為一組,大的值做最右邊的數,次大的做中間值,這裡就是把這個次大的值加起來。
例如 現在排序後 有1 2 5 5 8 9
,那麼取8
和5
相加等於13
#include
#include
#include
using namespace std;
int main()
std:
:sort
(v.begin()
,v.end()
);long long ret =0;
for(int i =
3*n -
2,count = n;count >
0;i -=
2,count--
) ret += v[i]
;
cout << ret << endl;
}
0002組隊參賽規則
quote 乙個參賽隊伍不能超過三人,可以擁有乙個替補。包括替補在內任何參賽隊員必須為高中畢業五年內,才可以參賽,也就是說研究生一年級的學生還可以參加。現在的問題是給你乙個隊伍,請判斷這個隊伍是否合法。輸入資料 輸入資料報括若干組,每一組包括有若干行,第一行為乙個整數n,為這個隊伍的人數,接著有n行...
20110805 組隊賽 f題
測試資料有多組,對於每組資料,第一行為乙個整數n 1 n 10000 表示表示式中數字的個數,其後的第i 1行每行有乙個整數表示xi的值 1 i n 1 xi 1000000000 對於每組資料,如果你能幫阿里巴巴開啟石門,輸出yes,否則輸出no。58421143579 yesno 這是劉汝佳黑書...
BNUOJ 51280 組隊活動
題目 題意 中文題目!解題方法 dp i i個人的組隊方案數。dp 1,dp i sigma c i 1,j dp i 1 j 這個方程怎麼來的呢?考慮一下第i個人,在他前面有j個人,他可以選擇的方案數為c i 1,j 剩餘的i 1 j的方案數為dp i 1 j 根據乘法原理得到每個j的貢獻是c i...