【原题链接】
有一组共有N个正整数,每次只能取其中的一个数,每次没有被取到的数会减少相应的值,把每次取到数的值累加,问共要取K个数,在所有取法中,和最大是多少?
快排+部分和
首先,假定k=n,我们该如何安排,假定每个位置的两个数为xi,yi,显然sum(xi)这部分的和是固定的,那对于yi该怎么安排呢?一种安排是把yi从大到小排好序,越大的yi越先使用,这样就得一个和为sum((i-1)*yi),记为:sum0。这部分和是不是所有方案最小的呢?我们来讨论一下:
假定有另一种方案,它是上面排序方案的一种变形,其它位置不变,只把yi,与yj交换(其中i<j且yi>yj)用这个方案的和记为sum1,则:
sum1-sum0=(i-1)*yj+(j-1)*yi-(i-1)*yi-(j-1)*yi=i*yj-i*yi+j*yi-j*yj=(j-i)*(yi-yj)>0
同样的方案可以处理其它种方案都的和都比sum0要大,所以得按sum0这种方案排序得sum0的值最小,即得sum(xi)-sum0的值最大。
这样我们在k=n时,只要把所有的数据按yi的值先排序即可得到所需要的结果。
那现在对k<n呢?是不是也可以利用上面的这种想法呢?结果是显然的!
假定我们从n个数中先取了k个数,这k个数该怎么排呢?显然这也就是从k个数中选取k个数,同上面的想法一样,只需要把yi从大到排序就好了。
若照此方法,就变成了从n个数中选k个,再排序,那时间复杂度也太大了吧!
更优的方法是,先把数据按yi从大到小排序(当yi相同时,按xi从大到小排序),这样选择出来的k个数也必然是有序的。
按照从n个人中去掉一个,剩下的n-1个人和最大,再从这n-1个人中去掉一个,剩下的n-2个人和最大,……一直到只剩下k个人即可!这其中的计算就需要使用部分和的方法了!