Forsaken給學生分組

2022-08-16 01:12:15 字數 1293 閱讀 6340

時間限制: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=1k​f(i))。

第一行兩個整數分別為n,kn,kn,k。

第二行nnn個數分別代表a1,a2...ana_1,a_2...a_na1​,a2​...an​。

乙個整數表示最大的管理方便度之和。
示例1

複製

5 1

10 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 輸出...