题目传送门
作为一个蒟蒻,总是因为找不到状态转移方程而怀疑自己的智商。。我可能真的智商不够QAQ
题目大意是每次选一个元素个数至少为k的区间,然后它的花费是这个区间的极差(max-min),让你求最小花费。
求最优解,下意识想到动态规划问题,但是我练题不够,没有想到状态转移方程,只好赛后补题。
代码
#include<bits/stdc++.h>
using namespace std;
const int N=3e5+5;
const int mod=1e9+7;
const int INF=0x3f3f3f3f;
const double EPS=1e-6;
typedef long long ll;
#define IOS ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
//#define int long long
ll a[N],dp[N];
signed main()
{
IOS;
//freopen("","r",stdin);
//freopen("","w",stdout);
int n,k;
cin>>n>>k;
for(int i=1;i<=n;i++)
{
cin>>a[i];
}
sort(a+1,a+n+1);
memset(dp,INF,sizeof dp);
dp[k]=a[k]-a[1];
for(int i=k+1;i<=n;i++)
{
dp[i]=min(dp[i-1]+a[i]-a[i-1],dp[i-k]+a[i]-a[i-k+1]);
}
cout<<dp[n]<<endl;
}