codeforces 731 E. Funny Game (博弈+dp,逆推)

题目:http://codeforces.com/group/1EzrFFyOc0/contest/731/problem/E
题意:有n个数(写在纸片上),分别为a1,a2,a3,…,an,有两个人P和G,P先取数ai (i 2),并拿走ai 及其左边的所有数,将这些数的和的数字写在纸上,放在数列的最左边,接下来G按同样的规则取,两人直到最后只剩下一张纸的时候停止游戏。
两人的目的都是要使自己所有取得的和与对方的和相减差值最大,输出先手P所取总和 - 后手G所取总和的差值。

思路:逆推。
易得每次取得的卡片上的数之和,即是该数在原数列中的前缀和,所以先分别求出a1 到ai 的前缀和si(后面对数列的操作都是对于数列来说的)

正着看,难确定选哪张卡片更好,并不是简单的两个人都各自取能选的卡片中的最大的值,还需要想到如何逼对方的值尽量小 比如若数列a为:1,-7,-2,1,前缀和数列s为:1,-6,-8,-7 若先手选了最大的-6(题目要求从第二张选起),后手不会去选剩下的数中最大的-7,而是会选-8,那样先手就还需要选-7,对于后手来说此时的差值就是(-8)-(-7-5)=4比选-6的情况(-7)-(-6)= -1更占上风,而此时对于先手来说他的差值就是-4了,当然先手也是聪明人,为了达到他的目的,他最初会选-8,让后手选-7,差值为-1,比之前的-4好多了,也比先手一开始就全部取完的-7好多了。那么没法正着通过贪心各自取最大值来做,正着做比较困难的情况下,发现如果逆推的话,因为最后一张卡片肯定会有人选,这是个突破口。

最后一张卡片肯定会有人选。若此时对方从来没有机会选过数,那么两人差值为 sn- 0=sn
若要在 n 之前再选一张卡片am ,那么需要要求 sm - sn > sn - 0 (因为对于先手来讲,如果找不到这样的 am ,能够使得他与对手的差值比原来全部取完时的差值更大的话,他不如直接全部取完,下面几行 >号右边的式子也是这个道理)
依次类推,在 m 前选一张卡片ak ,要求 sk - sm + sn<

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值