zoukankan      html  css  js  c++  java
  • [POI2010] GRA-The Minima Game

    给出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;
    }
    
  • 相关阅读:
    tip
    tip
    paper clip 使用
    这个菜单有点cool
    jqueryoptiontree plugin introduce by frederick.mao
    ruby语法不理解
    近来心得,心不可太贪,见好就收
    XPCOM的有关链接
    rails router
    rails3高端observer模式
  • 原文地址:https://www.cnblogs.com/mollnn/p/12255073.html
Copyright © 2011-2022 走看看