题意
n个数中选出一组K个数,要求这一组数中所有数与这组数中最大值的差之和最小。
思路
很容易想到排序构造单调性,很容易想到利用前缀和降低复杂度。
把题意翻译成数学语言就是:
$sum_{j=i}^{i+K-1}a[i] - a[j] $
$=K*a[i] -sum_{j=i}^{i+K-1}a[j]$
$=K*a[i]-(s[i+K-1]-s[i-1])$
化简式子之后就可以线性做了。
代码
1 #define inf 1000000000 2 int n,K; 3 LL a[N]; 4 LL s[N]; 5 bool cmp(const LL &x, const LL &y) 6 { 7 return x>y; 8 } 9 int main() 10 { 11 int tt=read(); 12 F(Case,1,tt){ 13 n=read();K=read(); 14 F(i,1,n) a[i]=read(); 15 sort(a+1,a+n+1,cmp); 16 s[1]=a[1]; 17 F(i,2,n) s[i]=s[i-1]+a[i]; 18 LL ans=inf; 19 F(i,1,n-K+1){ 20 LL sum=0LL; 21 sum=K*a[i]-(s[i+K-1]-s[i-1]); 22 ans=min(ans,sum); 23 } 24 printf("Case #%d: %d ",Case,ans); 25 } 26 return 0; 27 }