题意:给你一串数,问你怎么构造,使得啊a[i]-a[i+k]的加和最大
思路:这个真的是数学太渣了,这个分块一直没想到,不过dp部分还是恨到理解的,当然后看的聚聚们的题解,构造的很巧%orz
代码:
#include <bits/stdc++.h> using namespace std; typedef long long LL; LL a[300100],sum[300100]; LL dp[5050][5050]; int main() { int n,k; while(~scanf("%d%d",&n,&k)){ sum[0]=0; for(int i=1;i<=n;i++){ scanf("%I64d",&a[i]); sum[i]=sum[i-1]+a[i]; } sort(a+1,a+1+n); if(n<=k){ printf("0\n"); continue; } memset(dp,0,sizeof(dp)); int l0=n/k; int l1=n/k+1; int len0=k-n%k,len1=n%k; a[0]=a[1]; for(int i=0;i<=len0;i++){ for(int j=0;j<=len1;j++){ if(i==0&&j==0)continue; if(i){ k=(i-1)*l0+j*l1; dp[i][j]=max(dp[i][j],dp[i-1][j]+a[k+1]-a[k]); } if(j){ k=i*l0+(j-1)*l1; dp[i][j]=max(dp[i][j],dp[i][j-1]+a[k+1]-a[k]); } } } printf("%I64d\n",a[n]-a[1]-dp[len0][len1]); } return 0; }