時間限制:c/c++ 1秒,其他語言2秒
空間限制:c/c++ 262144k,其他語言524288k
64bit io format: %lld
forsaken有nnn個學生,每個學生都有乙個能力值aia_iai,為了方便管理,forsaken決定將nnn個學生分成kkk組。
forsaken認為如果乙個小組有乙個能力在該小組極其突出的學生,這個小組就比較容易管理。我們定義對於teamiteam_iteami來說,這個小組的管理方便度f(i)=max(aj∈teami)−min(aj∈teami)f(i) = max(a_j \in team_i) - min(a_j \in team_i)f(i)=max(aj∈teami)−min(aj∈teami)。forsaken現在想知道max(∑i=1kf(i))max(\sum_^f(i))max(∑i=1kf(i))。
第一行兩個整數分別為n,kn,kn,k。
第二行nnn個數分別代表a1,a2...ana_1,a_2...a_na1,a2...an。
乙個整數表示最大的管理方便度之和。示例1
複製
5 110 6 2 7 9
複製
8
1≤n≤1e51 \leq n \leq 1e51≤n≤1e5
1≤k≤n1 \leq k \leq n1≤k≤n
1≤ai≤1e91 \leq a_i \leq 1e91≤ai≤1e9
思路:貪心
對於每個組,要有乙個最大值-最小值,不用管這個組裡的其他數字。
當 (組數*2)k*2>n(數字的個數)時,就會出現乙個數字一組的情況,2*k-n就是乙個數為一組的組數。如果拿k-(2*k-n),那麼剩下的k則表示一組裡至少有乙個最大值和乙個最小值的情況。之後只需要統計k個最大值-最小值的和就是答案。
#include #include#include
#include
#include
using
namespace
std;
const
int maxn= 200005
;const
int maxnum =100000
;long
long
f[maxn];
long
long
dp[maxn];
intmain()
while
(k)
cout
<< ans
}
洛谷 P1109 學生分組
題目描述 有n組學生,給出初始時每組中的學生個數,再給出每組學生人數的上界r和下界l l r 每次你可以在某組中選出乙個學生把他安排到另外一組中,問最少要多少次才可以使n組學生的人數都在 l,r 中。輸入輸出格式 輸入格式 第一行乙個整數n,表示學生組數 n 50 第二行n個整數,表示每組的學生個數...
學生管理之原生分頁方法
coding utf 8 author administrator date 2016 12 7 class pagerhelper def init self,total count,current page,base url,per page 10 self.total count total ...
學生分數的最小差值
leetcode 給你乙個 下標從 0 開始 的整數陣列 nums 其中 nums i 表示第 i 名學生的分數。另給你乙個整數 k 從陣列中選出任意 k 名學生的分數,使這 k 個分數間 最高分 和 最低分 的 差值 達到 最小化 返回可能的 最小差值 示例 1 輸入 nums 90 k 1 輸出...