2020牛客寒假算法基础集训营2 施魔法

https://ac.nowcoder.com/acm/contest/3003/H

题意

  有 n 个元素( 编号 1..n ),第 i 个元素的能量值为 ai
  选择至少 k 个元素来施放一次魔法,魔法消耗的魔力是这些元素能量值的极差。
形式化地,若所用元素编号集合为 S,则消耗的魔力为 maxiS{ai}miniS{ai}。

  如果每个元素必须被使用恰好一次,那么最少需要多少魔力才能用完所有元素?

题解

  简单dp。

  先将n个元素按能量值升序排序。

  令  表示用掉前 i 个元素的最小代价。

  

 

代码

#include <bits/stdc++.h>
using namespace std;
const int maxn=3e5+5;
int arr[maxn],dp[maxn];
int main()
{
    fill(dp,dp+maxn,0x3fffffff);
    int n,k,i,pre;
    scanf("%d%d",&n,&k);
    for(i=1;i<=n;i++) scanf("%d",&arr[i]);
    sort(arr+1,arr+n+1);
    pre=-arr[1];
    for(i=k;i<=n;i++)
    {
       dp[i]=arr[i]+pre;
       pre=min(pre,dp[i-k+1]-arr[i-k+2]); 
    }
    printf("%d",dp[n]);
    system("pause");
    return 0;
}
posted @ 2020-02-12 23:02  Vivid-BinGo  阅读(158)  评论(0编辑  收藏  举报