码迷,mamicode.com
首页 > 其他好文 > 详细

[POI2010] GRA-The Minima Game - 贪心,dp,博弈论

时间:2020-02-03 14:08:43      阅读:88      评论:0      收藏:0      [点我收藏+]

标签:++   个人   lin   c++   转移   code   暴力   就是   lld   

给出N个正整数,AB两个人轮流取数,A先取。每次可以取任意多个数,直到N个数都被取走。每次获得的得分为取的数中的最小值,A和B的策略都是尽可能使得自己的得分减去对手的得分更大。在这样的情况下,最终A的得分减去B的得分为多少。

引理 先手一定从大到小取若干个连续的数

倒过来考虑,设 \(f[i]\) 表示取完了从小到大的前 \(i\) 个数,当前局面下先手减去后手的最大值

显然有 \(f[i] = Max(a[j]-f[j-1])\)

这样暴力转移是 \(O(n^2)\) 的,考虑优化

观察这个转移方程,本质上就是一个分段取数问题,因此我们可以有

\(f[i]=Max(f[i-1],a[i]-f[i-1])\)

为了再省点事,我们干脆设 \(x\),则获得迭代式

\(x=Max(x,a[i]-x)\)

脑袋转了半天,代码倒是精致

#include <bits/stdc++.h>
using namespace std;

long long n,a[1000005],x;

int main() {
    scanf("%lld",&n);
    for(int i=1;i<=n;i++) scanf("%lld",&a[i]);
    sort(a+1,a+n+1);
    for(int i=1;i<=n;i++)x=max(x,a[i]-x);
    cout<<x<<endl;
}

[POI2010] GRA-The Minima Game - 贪心,dp,博弈论

标签:++   个人   lin   c++   转移   code   暴力   就是   lld   

原文地址:https://www.cnblogs.com/mollnn/p/12255073.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!