Codeforces Round #376 (Div. 2) E. Funny Game
2016-10-22 08:35
267 查看
原题网址:http://codeforces.com/contest/731/problem/E
先求一遍前缀和,问题就变成了:一排数,两个人轮流取数,保证取的位置递增(且从第二个数开始取),每个人要使自己取的数的和尽量大,求在最优策略下取的max(先手和-后手和)。
用f[i]记先手取第i位先手的最优答案,g[i]记先手取第i位后手的最优答案,从后往前推,对于一个i,后手最大能取的肯定是f[j] (j>i) 中最大的(不妨设这样的j为maxi),因为先手取了第i位后手在取第j(j>i)的时候就是先手了,他肯定会选一个最大的。而f[i]=a[i]-g[maxi],因为先手取了第i位后能取多少取决于后手下一步取哪一个,此时先手就变成了后手。(注意初值)
先求一遍前缀和,问题就变成了:一排数,两个人轮流取数,保证取的位置递增(且从第二个数开始取),每个人要使自己取的数的和尽量大,求在最优策略下取的max(先手和-后手和)。
用f[i]记先手取第i位先手的最优答案,g[i]记先手取第i位后手的最优答案,从后往前推,对于一个i,后手最大能取的肯定是f[j] (j>i) 中最大的(不妨设这样的j为maxi),因为先手取了第i位后手在取第j(j>i)的时候就是先手了,他肯定会选一个最大的。而f[i]=a[i]-g[maxi],因为先手取了第i位后能取多少取决于后手下一步取哪一个,此时先手就变成了后手。(注意初值)
const INF=maxlongint*maxlongint; var a,f,g:array[0..200050] of int64; n,i,maxi,t:longint; begin read(n); for i:=1 to n do begin read(t); a[i]:=a[i-1]+t; end; maxi:=n;f[maxi]:=a ;g[maxi]:=0; for i:=n-1 downto 2 do begin g[i]:=f[maxi]; f[i]:=a[i]-g[i]; if (f[i]>f[maxi]) then maxi:=i; end; writeln(f[maxi]); end.
相关文章推荐
- 【筛法求素数】Codeforces Round #426 (Div. 1) A. The Meaningless Game
- CodeForces #426 div2 C The Meaningless Game
- Codeforces Round #426 (Div. 2) B.The Festive Evening+C.The Meaningless Game
- Codeforces Round #426 (Div. 2) C - The Meaningless Game
- poj 2599 A funny game 博弈论
- uva 1378 A Funny Stone Game(博弈论)
- Funny Funny Game
- Codeforces Round #258 (Div. 2/A)/Codeforces451A_Game With Sticks
- Codeforces Div. 2 #258-A. Game With Sticks
- Codeforces Round #280 (Div. 2) D. Vanya and Computer Game 数学
- 解题报告:Codeforces Round #432 (Div. 2) E.Arpa and a game with Mojtaba (博弈)
- CodeForces Div1: 995 D. Game(数学期望)
- Codeforces Round #169 (Div. 2) B. Little Girl and Game(博弈)
- POJ2484 A Funny Game (典型博弈论)
- CodeForces 731 E.Funny Game(dp)
- Codeforces Round #416 (Div. 2) D. Vladik and Favorite Game【交互题+BFS】
- POJ2599 A funny game (图博弈)
- Codeforces Round #419 (Div. 2) C.Karen and Game 思维
- Codeforces Round #385 (Div. 1) B. Hongcow's Game(bitmask)
- POJ 2484 A Funny Game