## [JZOJ]2109 清兵线 题解
**FIRST 题目大意**
给你一些正整数,这些正整数为数轴上若干个点代表的数。现求:假设从原点出发,走m以内(包括m)的距离最多能够访问多少个点,输出m-每个点到达时已经走过的距离的累加和。
****
**NEXT 前置结论**
![P1](https://img-blog.csdnimg.cn/20201006204224958.png#pic_center)
如图所示,首先我们假设数轴上有x,y两点,杀一个士兵的时间是$t_i$
∵$t_i \equiv 0$
∴**不存在**从远点跳过点$y$直接奔向点$x$存在最优解的可能性
****
**AFTER THAT 解题思路**
**40分思路**
排序+基于前置结论,进行dfs,普通可得40分,再优化一下可能能拿60分
**100分思路**
排序+动态规划
为了方便取,从小到大排序
既然不可能出现中间为断点的情况
那么我们想要最优解,我们已经死亡的士兵就一定是一个**区间**
状态易设:
$f_{i,j,0}$表示区间$i$~$j$全部已经被杀死了,当前状态杀死的是$i$(左边)最大值
$f_{i,j,1}$表示区间$i$~$j$全部已经被杀死了,当前状态杀死的是$j$(右边)最大值

可得一个大概的转移式:
$f_{i,j,0} = max(f_{i+1,j,0}+m-X,f_{i+1,j,1}+m-Y)$
$f_{i,j,1} = max(f_{i,j-1,0}+m-X,f_{i,j-1,1}+m-Y)$
现在我们就是要求这个 $X,Y$分别是多少(即损耗时间)
我们可以尝试转换一个思路:

即假设你要杀$k$个人,已经杀了$x$个,那么你每走$1$步,另外的生命值都-1.即总可以获得的收益减少了$(k-x)$
走$t$步同理$t(k-x)$
带入原式得
$X=(a_{i+1}-a_i) \cdot (k-j+i)$
$Y=(a_{j}-a_i) \cdot (k-j+i)$
由于$K$没有,那我们直接枚举就完事了。
***
**In The End**

1. 如果a数组里没有原点我们要补一个原点进去一起排序
2. 要注意$f$数组的特判和初始值
3. 如果$j-i+1>k$请及时break

最新文章

  1. unity对话代码
  2. TC SRM 591 DIV2 1000
  3. Android学习笔记(一)
  4. Linux刷新DNS缓存
  5. ArchLinux安装与配置小结
  6. oracle 修改表的sql语句
  7. 【转】有效修改max open files/ulimit -n
  8. php判断变量是否存在
  9. 线程锁的概念函数EnterCriticalSection和LeaveCriticalSection的使用方法
  10. Android - Fragment (一)定义
  11. Spring之ORM模块
  12. Python新手入门英文词汇笔记(1-2)
  13. Monotonic Array LT896
  14. Hadoop项目实战-用户行为分析之应用概述(二)
  15. CentOs 6.x 升级 Python 版本【转】
  16. centos7 关闭防护墙
  17. 唐顿庄园第一至五季/全集Downton Abbey迅雷下载
  18. Ubuntu 16.04系统下软件中心Software闪退解决办法
  19. bzoj 4650(洛谷 1117) [Noi2016]优秀的拆分——枚举长度的关键点+后缀数组
  20. solr入门之搜索建议的几种实现方式和最终选取实现思路

热门文章

  1. CPU有个禁区,内核权限也无法进入!
  2. Python错误,pip安装包或更新时因超时而报错误
  3. 设置android studio启动时不检查sdk Android studio启动时总是在找AndroidSDK的解决办法
  4. 【基础知识】Unity查漏补缺
  5. 分布式ID生成方案汇总
  6. 启动oracle11监听器错误
  7. Zabbix icmp pinger processes more than 75% busy
  8. shell小技巧(1)计算一个文件中空行数量
  9. BasicInterpreter2 改进版,简化了print函数
  10. 零基础一分钟入门Python