題目解析
此題題意,這是乙個求最優解的問題,三人一對,由首行n輸入的值來確定隊伍數目,我們為保證所有隊伍的水平值總和為最大值,則需讓隊伍中第二大的值盡量大。所以將最大值放到最右邊,最小是放左邊.
解題思路
1.本題的主要思路是貪心演算法,就是每次選值時都選當前能看到的區域性最優解,所以這裡的貪心就是保證每組的第二個值取到能選擇的最大值就可以,我們每次盡量取最大,但每組最大的值在右邊取不到,我們應該去找位於每組中間第二大的值。
2.排序,怎麼使每組取到位於中間第二大的值,首先進行公升序排序,一共有3*n個元素,前【0–n-1】個元素,肯定是陣列中相較於後面,最小的值。將他們作為每組最小數,排在最左邊,剩下的數兩兩一組且已經有序,通過陣列下標進行查詢,則將其每組兩數中次大的數的相加即可得到整個題所有隊伍的水平值總和最大值的最優解。其對應下標為然後取下標為3n - 2,3n - 4 ,3n - 4… n+2,n位置的元素累加即可。
讀文字可能太繞,上圖:
**實現:
#include
#include
#include
using
namespace std;
intmain()
long
long sum =0;
//sum存放每隊水平最優解之和,此題的解
sort
(array.
begin()
,array.
end())
;//將陣列中元素進行公升序,有序後【0-n-1】這n個數作為每隊中的最小值,剩餘的數兩兩一組,去第乙個做中間值,
for(
int i = n;i <=
3* n -
2;i+=2
) cout<
}}
牛客 程式設計題 組隊競賽c
牛牛舉辦了一次程式設計比賽,參加比賽的有3 n個選手,每個選手都有乙個水平值a i.現在要將這些選手進行組隊,一共組成n個隊伍,即每個隊伍3人.牛牛發現隊伍的水平值等於該隊伍隊員中第二高水平值。例如 乙個隊伍三個隊員的水平值分別是3,3,3.那麼隊伍的水平值是3 乙個隊伍三個隊員的水平值分別是3,2...
牛客競賽Anagram
一 題目 二 題意 給定兩個長度一樣的字串 均為大寫字母 計算將a變為和b一樣的構成最少需要多少步。三 思路 將a和b分別按字母順序排序,由於可能存在輪迴向前找的情況,為了避免繞大圈,所以直接將a的當前字母和b的尾巴上未匹配的字母進行操作。四 include include include intc...
E 海嘯 牛客競賽
時間限制 c c 1秒,其他語言2秒 空間限制 c c 262144k,其他語言524288k 64bit io format lld 有乙個沿海地區,可以看作有n行m列的城市,第i行第j列的城市海拔為h i j 由於沿海,所以這個地區經常會發生海嘯。海嘯發生時,部分城市會被淹沒,具體來說,海水高度...