2020牛客寒假算法基础集训营2
H 施魔法
题意
如题。
思路
动态规划。
f [ ]为DP数组,DP方程如下:
坑点
没想到可以一维解。。。
Code
#include <bits/stdc++.h>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <cmath>
#include <vector>
#include <queue>
using namespace std;
typedef long long ll;
typedef vector<int> VI;
typedef vector<VI> VII;
typedef vector<VII> VIII;
typedef pair<int, int> PII;
#define rep(i,a,b) for(int i=(a); i<=(b); i++)
#define per(i,a,b) for(int i=(a); i>=(b); i--)
const int N = 3e5 +5;
const int M =1e6 + 5;
const int INF = 0x3f3f3f3f;
const ll MOD1 = 1e9 + 7;
const ll MOD2 = 998244353;
const ll MOD3 = 233333333;
ll a[N];
ll dp[N];
ll qpow(ll a, ll b, ll p)
{
ll ret = 1;
while(b)
{
if(b&1) ret = ret*a%p;
a = a*a%p;
b >>= 1;
}
return ret;
}
int main()
{
memset(dp, 0x3f3f3f3f, sizeof(dp));
int n, k;
scanf("%d%d", &n, &k);
rep(i,1,n) scanf("%lld", &a[i]);
sort(a+1, a+1+n);
ll minn = -a[1];
rep(i,k,n)
{
dp[i] = minn + a[i];
minn = min(minn, dp[i-k+1]-a[i-k+2]);
}
printf("%lld\n", dp[n]);
return 0;
}