Kick Start 2019 - Round A A.Training 题解
Posted ryan0v0
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Kick Start 2019 - Round A A.Training 题解相关的知识,希望对你有一定的参考价值。
题意
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\n",Case,ans); 25 } 26 return 0; 27 }
以上是关于Kick Start 2019 - Round A A.Training 题解的主要内容,如果未能解决你的问题,请参考以下文章
Round G 2019 - Kick Start 2019
DP 好题Kick Start 2019 Round C Catch Some
Round A 2020 - Kick Start 2020