zoukankan      html  css  js  c++  java
  • 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;
    }
  • 相关阅读:
    数组的练习
    java基础类和对象
    字符串的练习
    二分查找算法
    Python-charle+fiddler
    python-week1-postman+jemter-soapUI
    OBB盒的实现
    Bounding volume
    OSG动画学习
    OSG 自定义数据类型 关键帧动画
  • 原文地址:https://www.cnblogs.com/VividBinGo/p/12301505.html
Copyright © 2011-2022 走看看