【原题链接】

【题意说明】

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

转载于:https://www.cnblogs.com/ahmasoi/archive/2012/11/02/2751648.html

最新文章

  1. 使用PlanAhead查看Virtex-7系列FPGA的底层架构
  2. c++学习笔记之基础---类内声明函数后在类外定义的一种方法
  3. 批量修改mp3文件的title等
  4. inspinia前端模板怎样修改图标
  5. 珠海 第十届亚洲机器人锦标赛_2016年第十届亚洲机器人锦标赛在广东珠海成功举办...
  6. 如何防止单例模式被JAVA反射攻击
  7. 【操作系统】核心知识归纳总结
  8. 自动化测试之Appium模拟机测试
  9. error loading python dll_Error loading Python DLL python36.dll 的解决办法 及其他pyinstaller问题...
  10. km算法c语言,KM算法最好的讲解+POJ2195[KM算法+最小费用流]
  11. python,无网、没网、生成环境迁移安装环境,支持virtualenv
  12. 数据库-linux安装mysql
  13. 19【推荐系统9】WideDeep和DeepCross模型
  14. 脚本变量中包含空格的解决办法
  15. 人力资源管理(HR)专业书籍推荐
  16. 数据库系统-数据库设计
  17. ext2文件系统源代码之inode.c
  18. VNC 锁屏之后无法输入密码解锁
  19. 《用户体验要素——以用户为中心的产品设计》读书笔记
  20. 《How to be nubility for coder》

热门文章

  1. Rabbit MQ windows下安装
  2. tensorflow gpu windows配置步骤教学
  3. 玩转ceph性能测试---对象存储(一)
  4. VMware下配置固定ip,于本机进行通信。
  5. 第十二章 Shell脚本编写及常见面试题(三)
  6. kbmmw 5.0 中的REST 服务
  7. Android中让Service被关闭后再重新启动
  8. Yeslab现任明教教主ISE课程前七部分免费发布
  9. established关键字
  10. OSPF区域不能与area 0 相连的解决方法