codeforces 571B
给出一个序列,可以任意调整序列的顺序,使得给出的式子的值最小
#include
#include
#include
#include
#define MAX 300007
using namespace std;
int n,k,a[MAX];
int dp[5007][5007];
int main ( )
{
while ( ~scanf ( "%d%d" , &n , &k ) )
{
for ( int i = 1; i <= n ; i++ )
scanf ( "%d" , &a[i] );
sort ( a+1 , a+n+1 );
int num1 = n%k;
int len1 = n/k+1;
int num2 = k - num1;
int len2 = n/k;
a[0] = a[1];
memset ( dp , 0 , sizeof ( dp ) );
for ( int i = 0 ; i <= num1 ; i++ )
for ( int j = 0 ; j <= num2 ; j++ )
{
if ( i )
{
int k = (i-1)*len1 + j*len2;
dp[i][j] = max ( dp[i][j] , dp[i-1][j] + a[k+1]-a[k] );
}
if ( j )
{
int k = i*len1 + (j-1)*len2;
dp[i][j] = max ( dp[i][j] , dp[i][j-1] + a[k+1]-a[k] );
}
}
int ans = a[n]-a[1] - dp[num1][num2];
printf ( "%d\n" , ans );
}
}