Girl Love Value

【原题链接】

【题意说明】

有一组共有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个人即可!这其中的计算就需要使用部分和的方法了!

posted on 2012-11-02 17:42  生活不变心在变  阅读(219)  评论(0编辑  收藏  举报

导航