2020算法设计竞赛
链接:https://ac.nowcoder.com/acm/contest/3003/H
来源:牛客网
牛可乐有 n 个元素( 编号 1..n ),第 i 个元素的能量值为 aia_iai。
牛可乐可以选择至少 k 个元素来施放一次魔法,魔法消耗的魔力是这些元素能量值的极差。形式化地,若所用元素编号集合为 S,则消耗的魔力为 maxi∈S{ai}−mini∈S{ai}\max_{i\in S}\{a_i\}-\min_{i\in S}\{a_i\}maxi∈S{ai}−mini∈S{ai}。
牛可乐要求每个元素必须被使用恰好一次。
牛可乐想知道他最少需要多少魔力才能用完所有元素,请你告诉他。
牛可乐可以选择至少 k 个元素来施放一次魔法,魔法消耗的魔力是这些元素能量值的极差。形式化地,若所用元素编号集合为 S,则消耗的魔力为 maxi∈S{ai}−mini∈S{ai}\max_{i\in S}\{a_i\}-\min_{i\in S}\{a_i\}maxi∈S{ai}−mini∈S{ai}。
牛可乐要求每个元素必须被使用恰好一次。
牛可乐想知道他最少需要多少魔力才能用完所有元素,请你告诉他。
输入描述:
第一行两个正整数 n,k\text{}n, kn,k 。
第二行 n 个整数 a1,a2,…,ana_1,a_2,\dots,a_na1,a2,…,an。
保证 1≤k≤n≤3×1051\leq k\leq n\leq 3\times 10^51≤k≤n≤3×105,0≤ai≤1090\leq a_i\leq 10^90≤ai≤109。
输出描述:
输出一行,一个整数表示答案。
1 #include<bits/stdc++.h> 2 using namespace std; 3 typedef long long ll; 4 const int MA=3e5+5; 5 const ll INF=1e9+7; 6 ll a[MA],dp[MA]; 7 int main() 8 { 9 int n,k; 10 scanf("%d%d",&n,&k); 11 for(int i=1;i<=n;++i) scanf("%lld",&a[i]),dp[i]=INF; 12 sort(a+1,a+n+1); 13 dp[k]=a[k]-a[1]; 14 for(int i=k+1;i<=n;++i){ 15 dp[i]=min(dp[i-1]-a[i-1]+a[i],dp[i-k]-a[i-k+1]+a[i]); 16 } 17 printf("%lld\n",dp[n]); 18 return 0; 19 }